From 5c8136b0970471d7fa19e0420767e6f2a00bc602 Mon Sep 17 00:00:00 2001 From: KP <109694228@qq.com> Date: Mon, 8 Nov 2021 15:33:38 +0800 Subject: [PATCH] Add speech models. (#1678) --- docs/docs_ch/get_start/mac_quickstart.md | 2 +- .../audio/asr/deepspeech2_aishell/README.md | 153 + .../audio/asr/deepspeech2_aishell/__init__.py | 0 .../assets/conf/augmentation.json | 1 + .../assets/conf/deepspeech2.yaml | 68 + .../assets/data/mean_std.json | 1 + .../deepspeech2_aishell/assets/data/vocab.txt | 4301 ++++++++++++++ .../deepspeech2_aishell/deepspeech_tester.py | 81 + .../audio/asr/deepspeech2_aishell/module.py | 92 + .../asr/deepspeech2_aishell/requirements.txt | 12 + .../asr/deepspeech2_librispeech/README.md | 153 + .../asr/deepspeech2_librispeech/__init__.py | 0 .../assets/conf/augmentation.json | 1 + .../assets/conf/deepspeech2.yaml | 68 + .../deepspeech_tester.py | 81 + .../asr/deepspeech2_librispeech/module.py | 93 + .../deepspeech2_librispeech/requirements.txt | 11 + .../audio/asr/u2_conformer_aishell/README.md | 156 + .../asr/u2_conformer_aishell/__init__.py | 0 .../assets/conf/augmentation.json | 1 + .../assets/conf/conformer.yaml | 102 + .../assets/data/mean_std.json | 1 + .../assets/data/vocab.txt | 4233 ++++++++++++++ .../audio/asr/u2_conformer_aishell/module.py | 73 + .../asr/u2_conformer_aishell/requirements.txt | 12 + .../u2_conformer_tester.py | 80 + .../asr/u2_conformer_librispeech/README.md | 156 + .../asr/u2_conformer_librispeech/__init__.py | 0 .../assets/conf/augmentation.json | 1 + .../assets/conf/conformer.yaml | 116 + .../assets/data/bpe_unigram_5000.model | Bin 0 -> 325121 bytes .../assets/data/bpe_unigram_5000.vocab | 5000 ++++++++++++++++ .../assets/data/mean_std.json | 1 + .../assets/data/vocab.txt | 5002 +++++++++++++++++ .../asr/u2_conformer_librispeech/module.py | 74 + .../u2_conformer_librispeech/requirements.txt | 12 + .../u2_conformer_tester.py | 80 + .../PANNs/cnn10/README.md | 141 +- .../PANNs/cnn14/README.md | 141 +- .../audio_classification/PANNs/cnn6/README.md | 137 +- modules/audio/tts/fastspeech2_baker/README.md | 156 + .../audio/tts/fastspeech2_baker/__init__.py | 0 .../default.yaml | 104 + .../phone_id_map.txt | 268 + .../pwg_baker_ckpt_0.4/pwg_default.yaml | 128 + modules/audio/tts/fastspeech2_baker/module.py | 125 + .../tts/fastspeech2_baker/requirements.txt | 1 + .../audio/tts/fastspeech2_ljspeech/README.md | 156 + .../tts/fastspeech2_ljspeech/__init__.py | 0 .../default.yaml | 104 + .../phone_id_map.txt | 80 + .../pwg_ljspeech_ckpt_0.5/pwg_default.yaml | 119 + .../audio/tts/fastspeech2_ljspeech/module.py | 130 + .../tts/fastspeech2_ljspeech/requirements.txt | 1 + 54 files changed, 21827 insertions(+), 182 deletions(-) create mode 100644 modules/audio/asr/deepspeech2_aishell/README.md create mode 100644 modules/audio/asr/deepspeech2_aishell/__init__.py create mode 100644 modules/audio/asr/deepspeech2_aishell/assets/conf/augmentation.json create mode 100644 modules/audio/asr/deepspeech2_aishell/assets/conf/deepspeech2.yaml create mode 100644 modules/audio/asr/deepspeech2_aishell/assets/data/mean_std.json create mode 100644 modules/audio/asr/deepspeech2_aishell/assets/data/vocab.txt create mode 100644 modules/audio/asr/deepspeech2_aishell/deepspeech_tester.py create mode 100644 modules/audio/asr/deepspeech2_aishell/module.py create mode 100644 modules/audio/asr/deepspeech2_aishell/requirements.txt create mode 100644 modules/audio/asr/deepspeech2_librispeech/README.md create mode 100644 modules/audio/asr/deepspeech2_librispeech/__init__.py create mode 100644 modules/audio/asr/deepspeech2_librispeech/assets/conf/augmentation.json create mode 100644 modules/audio/asr/deepspeech2_librispeech/assets/conf/deepspeech2.yaml create mode 100644 modules/audio/asr/deepspeech2_librispeech/deepspeech_tester.py create mode 100644 modules/audio/asr/deepspeech2_librispeech/module.py create mode 100644 modules/audio/asr/deepspeech2_librispeech/requirements.txt create mode 100644 modules/audio/asr/u2_conformer_aishell/README.md create mode 100644 modules/audio/asr/u2_conformer_aishell/__init__.py create mode 100644 modules/audio/asr/u2_conformer_aishell/assets/conf/augmentation.json create mode 100644 modules/audio/asr/u2_conformer_aishell/assets/conf/conformer.yaml create mode 100644 modules/audio/asr/u2_conformer_aishell/assets/data/mean_std.json create mode 100644 modules/audio/asr/u2_conformer_aishell/assets/data/vocab.txt create mode 100644 modules/audio/asr/u2_conformer_aishell/module.py create mode 100644 modules/audio/asr/u2_conformer_aishell/requirements.txt create mode 100644 modules/audio/asr/u2_conformer_aishell/u2_conformer_tester.py create mode 100644 modules/audio/asr/u2_conformer_librispeech/README.md create mode 100644 modules/audio/asr/u2_conformer_librispeech/__init__.py create mode 100644 modules/audio/asr/u2_conformer_librispeech/assets/conf/augmentation.json create mode 100644 modules/audio/asr/u2_conformer_librispeech/assets/conf/conformer.yaml create mode 100644 modules/audio/asr/u2_conformer_librispeech/assets/data/bpe_unigram_5000.model create mode 100644 modules/audio/asr/u2_conformer_librispeech/assets/data/bpe_unigram_5000.vocab create mode 100644 modules/audio/asr/u2_conformer_librispeech/assets/data/mean_std.json create mode 100644 modules/audio/asr/u2_conformer_librispeech/assets/data/vocab.txt create mode 100644 modules/audio/asr/u2_conformer_librispeech/module.py create mode 100644 modules/audio/asr/u2_conformer_librispeech/requirements.txt create mode 100644 modules/audio/asr/u2_conformer_librispeech/u2_conformer_tester.py create mode 100644 modules/audio/tts/fastspeech2_baker/README.md create mode 100644 modules/audio/tts/fastspeech2_baker/__init__.py create mode 100644 modules/audio/tts/fastspeech2_baker/assets/fastspeech2_nosil_baker_ckpt_0.4/default.yaml create mode 100644 modules/audio/tts/fastspeech2_baker/assets/fastspeech2_nosil_baker_ckpt_0.4/phone_id_map.txt create mode 100644 modules/audio/tts/fastspeech2_baker/assets/pwg_baker_ckpt_0.4/pwg_default.yaml create mode 100644 modules/audio/tts/fastspeech2_baker/module.py create mode 100644 modules/audio/tts/fastspeech2_baker/requirements.txt create mode 100644 modules/audio/tts/fastspeech2_ljspeech/README.md create mode 100644 modules/audio/tts/fastspeech2_ljspeech/__init__.py create mode 100644 modules/audio/tts/fastspeech2_ljspeech/assets/fastspeech2_nosil_ljspeech_ckpt_0.5/default.yaml create mode 100644 modules/audio/tts/fastspeech2_ljspeech/assets/fastspeech2_nosil_ljspeech_ckpt_0.5/phone_id_map.txt create mode 100644 modules/audio/tts/fastspeech2_ljspeech/assets/pwg_ljspeech_ckpt_0.5/pwg_default.yaml create mode 100644 modules/audio/tts/fastspeech2_ljspeech/module.py create mode 100644 modules/audio/tts/fastspeech2_ljspeech/requirements.txt diff --git a/docs/docs_ch/get_start/mac_quickstart.md b/docs/docs_ch/get_start/mac_quickstart.md index ba765fdf..f49160d1 100755 --- a/docs/docs_ch/get_start/mac_quickstart.md +++ b/docs/docs_ch/get_start/mac_quickstart.md @@ -192,7 +192,7 @@ - output image ## 第6步:飞桨预训练模型探索之旅 -- 恭喜你,到这里PaddleHub在windows环境下的安装和入门案例就全部完成了,快快开启你更多的深度学习模型探索之旅吧。[【更多模型探索,跳转飞桨官网】](https://www.paddlepaddle.org.cn/hublist) +- 恭喜你,到这里PaddleHub在mac环境下的安装和入门案例就全部完成了,快快开启你更多的深度学习模型探索之旅吧。[【更多模型探索,跳转飞桨官网】](https://www.paddlepaddle.org.cn/hublist) diff --git a/modules/audio/asr/deepspeech2_aishell/README.md b/modules/audio/asr/deepspeech2_aishell/README.md new file mode 100644 index 00000000..a75ba672 --- /dev/null +++ b/modules/audio/asr/deepspeech2_aishell/README.md @@ -0,0 +1,153 @@ +# deepspeech2_aishell + +|模型名称|deepspeech2_aishell| +| :--- | :---: | +|类别|语音-语音识别| +|网络|DeepSpeech2| +|数据集|AISHELL-1| +|是否支持Fine-tuning|否| +|模型大小|306MB| +|最新更新日期|2021-10-20| +|数据指标|中文CER 0.065| + +## 一、模型基本信息 + +### 模型介绍 + +DeepSpeech2是百度于2015年提出的适用于英文和中文的end-to-end语音识别模型。deepspeech2_aishell使用了DeepSpeech2离线模型的结构,模型主要由2层卷积网络和3层GRU组成,并在中文普通话开源语音数据集[AISHELL-1](http://www.aishelltech.com/kysjcp)进行了预训练,该模型在其测试集上的CER指标是0.065。 + + +

+
+

+ +更多详情请参考[Deep Speech 2: End-to-End Speech Recognition in English and Mandarin](https://arxiv.org/abs/1512.02595) + +## 二、安装 + +- ### 1、系统依赖 + + - libsndfile, swig >= 3.0 + - Linux + ```shell + $ sudo apt-get install libsndfile swig + or + $ sudo yum install libsndfile swig + ``` + - MacOs + ``` + $ brew install libsndfile swig + ``` + +- ### 2、环境依赖 + - swig_decoder: + ``` + git clone https://github.com/PaddlePaddle/DeepSpeech.git && cd DeepSpeech && git reset --hard b53171694e7b87abe7ea96870b2f4d8e0e2b1485 && cd deepspeech/decoders/ctcdecoder/swig && sh setup.sh + ``` + + - paddlepaddle >= 2.1.0 + + - paddlehub >= 2.1.0 | [如何安装PaddleHub](../../../../docs/docs_ch/get_start/installation.rst) + +- ### 3、安装 + + - ```shell + $ hub install deepspeech2_aishell + ``` + - 如您安装时遇到问题,可参考:[零基础windows安装](../../../../docs/docs_ch/get_start/windows_quickstart.md) + | [零基础Linux安装](../../../../docs/docs_ch/get_start/linux_quickstart.md) | [零基础MacOS安装](../../../../docs/docs_ch/get_start/mac_quickstart.md) + + +## 三、模型API预测 + +- ### 1、预测代码示例 + + ```python + import paddlehub as hub + + # 采样率为16k,格式为wav的中文语音音频 + wav_file = '/PATH/TO/AUDIO' + + model = hub.Module( + name='deepspeech2_aishell', + version='1.0.0') + text = model.speech_recognize(wav_file) + + print(text) + ``` + +- ### 2、API + - ```python + def check_audio(audio_file) + ``` + - 检查输入音频格式和采样率是否满足为16000 + + - **参数** + + - `audio_file`:本地音频文件(*.wav)的路径,如`/path/to/input.wav` + + - ```python + def speech_recognize( + audio_file, + device='cpu', + ) + ``` + - 将输入的音频识别成文字 + + - **参数** + + - `audio_file`:本地音频文件(*.wav)的路径,如`/path/to/input.wav` + - `device`:预测时使用的设备,默认为`cpu`,如需使用gpu预测,请设置为`gpu`。 + + - **返回** + + - `text`:str类型,返回输入音频的识别文字结果。 + + +## 四、服务部署 + +- PaddleHub Serving可以部署一个在线的语音识别服务。 + +- ### 第一步:启动PaddleHub Serving + + - ```shell + $ hub serving start -m deepspeech2_aishell + ``` + + - 这样就完成了一个语音识别服务化API的部署,默认端口号为8866。 + + - **NOTE:** 如使用GPU预测,则需要在启动服务之前,请设置CUDA_VISIBLE_DEVICES环境变量,否则不用设置。 + +- ### 第二步:发送预测请求 + + - 配置好服务端,以下数行代码即可实现发送预测请求,获取预测结果 + + - ```python + import requests + import json + + # 需要识别的音频的存放路径,确保部署服务的机器可访问 + file = '/path/to/input.wav' + + # 以key的方式指定text传入预测方法的时的参数,此例中为"audio_file" + data = {"audio_file": file} + + # 发送post请求,content-type类型应指定json方式,url中的ip地址需改为对应机器的ip + url = "http://127.0.0.1:8866/predict/deepspeech2_aishell" + + # 指定post请求的headers为application/json方式 + headers = {"Content-Type": "application/json"} + + r = requests.post(url=url, headers=headers, data=json.dumps(data)) + print(r.json()) + ``` + +## 五、更新历史 + +* 1.0.0 + + 初始发布 + + ```shell + $ hub install deepspeech2_aishell + ``` diff --git a/modules/audio/asr/deepspeech2_aishell/__init__.py b/modules/audio/asr/deepspeech2_aishell/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/modules/audio/asr/deepspeech2_aishell/assets/conf/augmentation.json b/modules/audio/asr/deepspeech2_aishell/assets/conf/augmentation.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/modules/audio/asr/deepspeech2_aishell/assets/conf/augmentation.json @@ -0,0 +1 @@ +{} diff --git a/modules/audio/asr/deepspeech2_aishell/assets/conf/deepspeech2.yaml b/modules/audio/asr/deepspeech2_aishell/assets/conf/deepspeech2.yaml new file mode 100644 index 00000000..ecbe9123 --- /dev/null +++ b/modules/audio/asr/deepspeech2_aishell/assets/conf/deepspeech2.yaml @@ -0,0 +1,68 @@ +# https://yaml.org/type/float.html +data: + train_manifest: data/manifest.train + dev_manifest: data/manifest.dev + test_manifest: data/manifest.test + min_input_len: 0.0 + max_input_len: 27.0 # second + min_output_len: 0.0 + max_output_len: .inf + min_output_input_ratio: 0.00 + max_output_input_ratio: .inf + +collator: + batch_size: 64 # one gpu + mean_std_filepath: data/mean_std.json + unit_type: char + vocab_filepath: data/vocab.txt + augmentation_config: conf/augmentation.json + random_seed: 0 + spm_model_prefix: + spectrum_type: linear + feat_dim: + delta_delta: False + stride_ms: 10.0 + window_ms: 20.0 + n_fft: None + max_freq: None + target_sample_rate: 16000 + use_dB_normalization: True + target_dB: -20 + dither: 1.0 + keep_transcription_text: False + sortagrad: True + shuffle_method: batch_shuffle + num_workers: 2 + +model: + num_conv_layers: 2 + num_rnn_layers: 3 + rnn_layer_size: 1024 + use_gru: True + share_rnn_weights: False + blank_id: 0 + ctc_grad_norm_type: instance + +training: + n_epoch: 80 + accum_grad: 1 + lr: 2e-3 + lr_decay: 0.83 + weight_decay: 1e-06 + global_grad_clip: 3.0 + log_interval: 100 + checkpoint: + kbest_n: 50 + latest_n: 5 + +decoding: + batch_size: 128 + error_rate_type: cer + decoding_method: ctc_beam_search + lang_model_path: data/lm/zh_giga.no_cna_cmn.prune01244.klm + alpha: 1.9 + beta: 5.0 + beam_size: 300 + cutoff_prob: 0.99 + cutoff_top_n: 40 + num_proc_bsearch: 10 diff --git a/modules/audio/asr/deepspeech2_aishell/assets/data/mean_std.json b/modules/audio/asr/deepspeech2_aishell/assets/data/mean_std.json new file mode 100644 index 00000000..6770184f --- /dev/null +++ b/modules/audio/asr/deepspeech2_aishell/assets/data/mean_std.json @@ -0,0 +1 @@ +{"mean_stat": [-13505966.65209869, -12778154.889588555, -13487728.30750011, -12897344.94123812, -12472281.490772562, -12631566.475106332, -13391790.349327326, -14045382.570026815, -14159320.465516506, -14273422.438486755, -14639805.161347123, -15145380.07768254, -15612893.133258691, -15938542.05012206, -16115293.502621327, -16188225.698757892, -16317206.280373082, -16500598.476283036, -16671564.297937019, -16804599.860397574, -16916423.142814968, -17011785.59439087, -17075067.62262626, -17154580.16740178, -17257812.961825978, -17355683.228599995, -17441455.258318607, -17473199.925130684, -17488835.5763828, -17491232.15414511, -17485000.29006962, -17499471.646940477, -17551398.97122984, -17641732.10682403, -17757209.077974595, -17843801.500521667, -17935647.58641936, -18020362.347413756, -18117633.806080323, -18232427.58935143, -18316024.35215119, -18378789.145393644, -18421147.25807373, -18445805.18294822, -18460946.27810118, -18467914.04034822, -18469404.319909714, -18469606.974339806, -18470754.294192698, -18458320.91921723, -18441354.111811973, -18428332.216321833, -18422281.413955193, -18433421.585668042, -18460521.025954794, -18494800.856363494, -18539532.288011573, -18583823.79899225, -18614474.56256926, -18646872.180154275, -18661137.85367877, -18673590.719379324, -18702967.62040798, -18736434.748098046, -18777912.13098326, -18794675.486509323, -18837225.856196072, -18874872.796128694, -18927340.44407057, -18994929.076545004, -19060701.164406348, -19118006.18996682, -19175792.05766062, -19230755.996405277, -19270174.594219487, -19334788.35904946, -19401456.988906194, -19484580.095938426, -19582040.4715673, -19696598.86662636, -19810401.513227757, -19931755.37941177, -20021867.47620737, -20082298.984455004, -20114708.336475413, -20143802.72793865, -20146821.988139726, -20165613.317683898, -20189938.602584295, -20220059.08673595, -20242848.528134122, -20250859.979931064, -20267382.93048284, -20267964.544716164, -20261372.89563879, -20252878.74023849, -20247550.771284755, -20231778.31093504, -20231376.103159923, -20236926.52293088, -20248068.41488535, -20255076.901920393, -20262924.167151034, -20263926.583205637, -20263790.273742784, -20268560.080967404, -20268997.150654405, -20269810.816284582, -20267771.864327505, -20256472.703380838, -20241790.559690386, -20241865.794732895, -20244924.716114976, -20249736.631184842, -20257257.816903576, -20268027.212145977, -20277399.95533857, -20281840.8112546, -20270512.52002465, -20255938.63066214, -20242421.685443826, -20241986.654626504, -20237836.034444932, -20231458.31132546, -20218092.819713395, -20204994.19634715, -20198880.142133974, -20197376.49014031, -20198117.60450857, -20197443.473929476, -20191142.03632657, -20174428.452719454, -20159204.32090646, -20137981.294740904, -20124944.79897834, -20112774.604521394, -20109389.248600915, -20115248.61302806, -20117743.853294585, -20123076.93515528, -20132224.95454374, -20147099.26793121, -20169581.367630124, -20190957.518733896, -20215197.057997894, -20242033.589256056, -20282032.217160087, -20316778.653784916, -20360354.215504933, -20425089.908502825, -20534553.0465662, -20737928.349233944, -21091705.14104186, -21646013.197923105, -22403182.076235127, -23313516.63322832, -24244679.879594248, -25027534.00417361, -25502455.708560493, -25665136.744125813, -26602318.88405537], "var_stat": [209924783.1093623, 185218712.4577822, 209991180.89829063, 196198511.40798286, 186098265.7827955, 191905798.58923203, 214281935.29191792, 235042114.51049897, 240179456.24597096, 244657890.3963041, 256099586.32657292, 271849135.9872555, 287174069.13527167, 298171137.28863454, 304112589.91933817, 306553976.2206335, 310813670.30674237, 316958840.3099824, 322651440.3639528, 327213725.196089, 331252123.26114285, 334856188.3081607, 337217897.6545214, 340385427.82557064, 344400488.5633641, 348086880.08086526, 351349070.53148264, 352648076.18415344, 353409462.33704513, 353598061.4967693, 353405322.74993587, 353917215.6834277, 355784796.898883, 359222461.3224974, 363671441.7428676, 366908651.69908494, 370304677.0615045, 373477194.79721, 377174088.9808273, 381531608.6574547, 384703574.426059, 387104126.9474883, 388723211.11308575, 389687817.27351815, 390351031.4418706, 390659006.3690262, 390704649.89417714, 390702370.1919126, 390731862.59274197, 390216004.4126628, 389516083.054853, 389017745.636457, 388788872.1127645, 389269311.2239042, 390401819.5968815, 391842612.97859454, 393708801.05223197, 395569598.4694, 396868892.67152405, 398210915.02133286, 398743299.4753882, 399330344.88417244, 400565940.1325846, 401901693.4656316, 403513855.43933284, 404103248.96526104, 405986814.274556, 407507145.4104169, 409598353.6517908, 412453848.0248063, 415138273.0558441, 417479272.96907294, 419785633.3276395, 422003065.1681787, 423610264.8868346, 426260552.96545905, 428973536.3620236, 432368654.40899384, 436359561.5468266, 441119512.777527, 445884989.25794005, 451037422.65838546, 454872292.24179226, 457497136.8780015, 458904066.0675219, 460155836.4432799, 460272943.80738074, 461087498.6828549, 462144907.7850926, 463483598.81228757, 464530694.44478536, 464971538.85301507, 465771535.6019992, 465936698.93801653, 465741012.7287712, 465448625.0011534, 465296363.8603534, 464718299.2207512, 464720391.25778216, 465016640.5248736, 465564374.0248998, 465982788.8695927, 466425068.01245564, 466595649.90489674, 466707658.8296169, 467015570.78026086, 467099213.08769494, 467201640.15951264, 467163862.3709329, 466727597.56313753, 466174871.71213347, 466255498.45248336, 466439062.65458614, 466693130.99620277, 467068587.1422199, 467536070.1402474, 467955819.1549621, 468187227.1069643, 467742976.2778335, 467159585.250493, 466592359.52916145, 466583195.8099961, 466424348.9572719, 466155323.6074322, 465569620.1801811, 465021642.5158305, 464757658.6383867, 464713882.60103834, 464724239.2941314, 464679163.728191, 464407007.8705965, 463660736.0136739, 463001339.2385198, 462077058.47595775, 461505071.67199403, 460946277.95973784, 460816158.9197017, 461123589.268546, 461232998.1572812, 461445601.0442877, 461803238.28569543, 462436966.22005004, 463391404.7434971, 464299608.85523456, 465319405.3931429, 466432961.70208246, 468168080.3331244, 469640808.6809098, 471501539.22440934, 474301795.1694898, 479155711.93441755, 488314271.10405815, 504537056.23994666, 530509400.5201074, 566892036.4437443, 611792826.0442055, 658913502.9004005, 699716882.9169292, 725237302.8248898, 734259159.9571886, 789267050.8287783], "frame_num": 899422} diff --git a/modules/audio/asr/deepspeech2_aishell/assets/data/vocab.txt b/modules/audio/asr/deepspeech2_aishell/assets/data/vocab.txt new file mode 100644 index 00000000..e272b576 --- /dev/null +++ b/modules/audio/asr/deepspeech2_aishell/assets/data/vocab.txt @@ -0,0 +1,4301 @@ + + +一 +丁 +七 +万 +丈 +三 +上 +下 +不 +与 +丐 +丑 +专 +且 +世 +丘 +丙 +业 +丛 +东 +丝 +丞 +丢 +两 +严 +丧 +个 +丫 +中 +丰 +串 +临 +丸 +丹 +为 +主 +丽 +举 +乃 +久 +么 +义 +之 +乌 +乍 +乎 +乏 +乐 +乒 +乓 +乔 +乖 +乘 +乙 +九 +乞 +也 +习 +乡 +书 +买 +乱 +乳 +乾 +了 +予 +争 +事 +二 +于 +亏 +云 +互 +五 +井 +亚 +些 +亟 +亡 +亢 +交 +亥 +亦 +产 +亨 +亩 +享 +京 +亭 +亮 +亲 +亳 +亵 +人 +亿 +什 +仁 +仄 +仅 +仇 +今 +介 +仍 +从 +仑 +仓 +仔 +仕 +他 +仗 +付 +仙 +仡 +代 +令 +以 +仨 +仪 +们 +仰 +仲 +件 +价 +任 +份 +仿 +企 +伉 +伊 +伍 +伎 +伏 +伐 +休 +众 +优 +伙 +会 +伞 +伟 +传 +伢 +伤 +伦 +伪 +伯 +估 +伴 +伶 +伸 +伺 +似 +伽 +佃 +但 +位 +低 +住 +佐 +佑 +体 +何 +佘 +余 +佛 +作 +佟 +你 +佣 +佩 +佬 +佳 +佶 +佼 +使 +侃 +侄 +侈 +例 +侍 +侑 +侗 +供 +依 +侠 +侣 +侥 +侦 +侧 +侨 +侬 +侮 +侯 +侵 +便 +促 +俄 +俊 +俏 +俐 +俗 +俘 +俚 +保 +俞 +信 +俨 +俩 +俪 +俭 +修 +俯 +俱 +俸 +俺 +俾 +倍 +倒 +倘 +候 +倚 +倜 +借 +倡 +倦 +倩 +倪 +债 +值 +倾 +假 +偏 +做 +停 +健 +偶 +偷 +偿 +傅 +傍 +傥 +储 +催 +傲 +傻 +像 +僚 +僧 +僮 +僵 +僻 +儒 +儿 +兀 +允 +元 +兄 +充 +兆 +先 +光 +克 +免 +兑 +兔 +兖 +党 +兜 +兢 +入 +全 +八 +公 +六 +兰 +共 +关 +兴 +兵 +其 +具 +典 +兹 +养 +兼 +兽 +冀 +内 +冈 +冉 +册 +再 +冒 +冕 +冗 +写 +军 +农 +冠 +冤 +冥 +冬 +冯 +冰 +冲 +决 +况 +冶 +冷 +冻 +净 +凄 +准 +凇 +凉 +凋 +凌 +减 +凑 +凝 +几 +凡 +凤 +凭 +凯 +凰 +凳 +凶 +凸 +凹 +出 +击 +函 +凿 +刀 +刁 +刃 +分 +切 +刊 +刑 +划 +列 +刘 +则 +刚 +创 +初 +删 +判 +刨 +利 +别 +刮 +到 +制 +刷 +券 +刹 +刺 +刻 +剁 +剂 +剃 +削 +前 +剐 +剑 +剔 +剖 +剥 +剧 +剩 +剪 +副 +割 +剽 +剿 +劈 +力 +劝 +办 +功 +加 +务 +劣 +动 +助 +努 +劫 +励 +劲 +劳 +劵 +势 +勃 +勇 +勉 +勋 +勒 +勘 +募 +勤 +勺 +勾 +勿 +匀 +包 +匆 +匈 +匕 +化 +北 +匙 +匝 +匠 +匡 +匣 +匪 +匮 +匹 +区 +医 +匾 +匿 +十 +千 +升 +午 +卉 +半 +华 +协 +卑 +卒 +卓 +单 +卖 +南 +博 +卜 +卞 +占 +卡 +卢 +卤 +卦 +卧 +卫 +卯 +印 +危 +卲 +即 +却 +卵 +卷 +卸 +卿 +厂 +厄 +厅 +历 +厉 +压 +厌 +厕 +厘 +厚 +原 +厢 +厥 +厦 +厨 +厩 +厮 +去 +县 +参 +又 +叉 +及 +友 +双 +反 +发 +叔 +取 +受 +变 +叙 +叛 +叠 +口 +古 +句 +另 +叨 +叩 +只 +叫 +召 +叭 +叮 +可 +台 +叱 +史 +右 +叵 +叶 +号 +司 +叹 +叼 +吁 +吃 +各 +吆 +合 +吉 +吊 +同 +名 +后 +吏 +吐 +向 +吓 +吕 +吗 +君 +吝 +吞 +吟 +否 +吧 +吨 +吩 +含 +听 +吭 +启 +吴 +吵 +吸 +吹 +吻 +吼 +吾 +吿 +呀 +呃 +呆 +呈 +告 +呐 +呕 +呗 +员 +呛 +呜 +呢 +呦 +周 +呲 +味 +呵 +呼 +命 +咀 +咄 +咋 +和 +咎 +咏 +咐 +咒 +咔 +咕 +咖 +咙 +咚 +咣 +咤 +咧 +咨 +咪 +咫 +咬 +咯 +咱 +咳 +咸 +咽 +哀 +品 +哄 +哆 +哇 +哈 +哉 +响 +哎 +哑 +哒 +哗 +哟 +哥 +哦 +哨 +哪 +哭 +哲 +哺 +哼 +哽 +唁 +唇 +唉 +唏 +唐 +唠 +唤 +唬 +售 +唯 +唱 +唾 +啃 +商 +啊 +啕 +啡 +啤 +啥 +啦 +啧 +啪 +啬 +啰 +啵 +啶 +啸 +啼 +喀 +喂 +善 +喆 +喇 +喉 +喊 +喔 +喘 +喜 +喝 +喧 +喱 +喵 +喷 +喻 +喽 +嗅 +嗑 +嗒 +嗓 +嗡 +嗣 +嗤 +嗦 +嗨 +嗬 +嗯 +嗲 +嗷 +嗽 +嘀 +嘈 +嘉 +嘎 +嘘 +嘛 +嘟 +嘭 +嘱 +嘲 +嘴 +嘶 +嘻 +噎 +噘 +器 +噩 +噪 +噬 +噱 +噼 +嚎 +嚏 +嚓 +嚣 +嚷 +嚼 +囊 +囚 +四 +回 +因 +团 +囤 +囧 +园 +困 +围 +固 +国 +图 +圃 +圆 +圈 +土 +圣 +在 +圩 +圪 +圭 +地 +圳 +场 +圾 +址 +坂 +均 +坊 +坍 +坎 +坏 +坐 +坑 +块 +坚 +坛 +坝 +坞 +坟 +坠 +坡 +坤 +坦 +坪 +坯 +坷 +垂 +垃 +垄 +垅 +型 +垌 +垒 +垛 +垡 +垢 +垣 +垤 +垦 +垫 +垮 +埃 +埋 +城 +埔 +埜 +域 +埠 +培 +基 +堂 +堆 +堕 +堡 +堤 +堪 +堰 +堵 +塌 +塍 +塑 +塔 +塘 +塞 +填 +塬 +塾 +境 +墅 +墓 +墙 +增 +墟 +墨 +墩 +壁 +壑 +壕 +壤 +士 +壮 +声 +壳 +壶 +壹 +处 +备 +复 +夏 +夕 +外 +夙 +多 +夜 +够 +大 +天 +太 +夫 +夭 +央 +夯 +失 +头 +夷 +夸 +夹 +夺 +奂 +奇 +奈 +奉 +奋 +奎 +奏 +契 +奔 +奕 +奖 +套 +奘 +奚 +奠 +奢 +奥 +女 +奴 +奶 +奸 +她 +好 +如 +妃 +妄 +妆 +妇 +妈 +妊 +妍 +妒 +妖 +妙 +妞 +妤 +妥 +妧 +妨 +妩 +妮 +妯 +妹 +妻 +姆 +姊 +始 +姐 +姑 +姓 +委 +姗 +姚 +姜 +姝 +姣 +姥 +姨 +姬 +姻 +姿 +威 +娃 +娄 +娅 +娇 +娌 +娘 +娜 +娟 +娠 +娥 +娩 +娱 +娴 +娶 +娼 +婀 +婆 +婉 +婕 +婚 +婧 +婪 +婴 +婵 +婶 +婷 +婿 +媒 +媚 +媛 +媞 +媲 +媳 +嫁 +嫂 +嫉 +嫌 +嫔 +嫖 +嫚 +嫡 +嫣 +嫦 +嫩 +嬉 +嬛 +嬷 +孀 +子 +孔 +孕 +字 +存 +孙 +孚 +孜 +孝 +孟 +孢 +季 +孤 +学 +孩 +孪 +孰 +孱 +孵 +孺 +宁 +它 +宅 +宇 +守 +安 +宋 +完 +宏 +宓 +宕 +宗 +官 +宙 +定 +宛 +宜 +宝 +实 +宠 +审 +客 +宣 +室 +宦 +宪 +宫 +宰 +害 +宴 +宵 +家 +宸 +容 +宽 +宾 +宿 +寂 +寄 +寅 +密 +寇 +富 +寐 +寒 +寓 +寝 +寞 +察 +寡 +寥 +寨 +寮 +寰 +寸 +对 +寺 +寻 +导 +寿 +封 +射 +将 +尊 +小 +少 +尔 +尖 +尘 +尚 +尝 +尤 +尧 +尬 +就 +尴 +尸 +尹 +尺 +尼 +尽 +尾 +尿 +局 +屁 +层 +居 +屈 +届 +屋 +屌 +屎 +屏 +屑 +展 +属 +屠 +屡 +履 +屯 +山 +屹 +屿 +岁 +岂 +岌 +岐 +岔 +岖 +岗 +岚 +岛 +岩 +岬 +岭 +岱 +岳 +岷 +岸 +峁 +峙 +峡 +峥 +峨 +峪 +峭 +峰 +峻 +崂 +崃 +崇 +崎 +崔 +崖 +崛 +崧 +崩 +崭 +崴 +嵋 +嵌 +嵘 +嵛 +嵩 +嶝 +巅 +巍 +川 +州 +巡 +巢 +工 +左 +巧 +巨 +巩 +巫 +差 +己 +已 +巴 +巷 +巾 +巿 +币 +市 +布 +帅 +帆 +师 +希 +帐 +帕 +帖 +帘 +帚 +帜 +帝 +带 +席 +帮 +帷 +常 +帼 +帽 +幂 +幄 +幅 +幌 +幕 +幢 +干 +平 +年 +并 +幸 +幺 +幻 +幼 +幽 +广 +庄 +庆 +庇 +床 +序 +庐 +库 +应 +底 +店 +庙 +庚 +府 +庞 +废 +度 +座 +庭 +庵 +庶 +康 +庸 +庾 +廉 +廊 +廓 +廖 +延 +廷 +建 +开 +异 +弃 +弄 +弈 +弊 +式 +弑 +弓 +引 +弗 +弘 +弛 +弟 +张 +弥 +弦 +弧 +弩 +弯 +弱 +弹 +强 +归 +当 +录 +彝 +形 +彤 +彦 +彩 +彪 +彬 +彭 +彰 +影 +彷 +役 +彻 +彼 +彿 +往 +征 +径 +待 +徇 +很 +徉 +徊 +律 +徐 +徒 +得 +徘 +徙 +御 +循 +微 +德 +徽 +心 +必 +忆 +忌 +忍 +忐 +忑 +志 +忘 +忙 +忠 +忧 +忪 +快 +忱 +念 +忻 +忽 +怀 +态 +怂 +怅 +怎 +怒 +怕 +怖 +怜 +思 +怠 +怡 +急 +怦 +性 +怨 +怪 +怯 +怵 +总 +恋 +恍 +恐 +恒 +恙 +恢 +恣 +恤 +恨 +恩 +恪 +恬 +恭 +息 +恰 +恳 +恶 +恸 +恺 +恼 +恿 +悄 +悉 +悌 +悍 +悔 +悖 +悚 +悟 +悠 +患 +悦 +您 +悬 +悯 +悲 +悴 +悸 +悼 +情 +惆 +惊 +惋 +惑 +惕 +惚 +惜 +惟 +惠 +惦 +惧 +惨 +惩 +惫 +惬 +惮 +惯 +惰 +想 +惶 +惹 +惺 +愁 +愈 +愉 +意 +愕 +愚 +感 +愤 +愧 +愿 +慈 +慌 +慎 +慑 +慕 +慢 +慧 +慨 +慰 +慷 +憋 +憔 +憧 +憨 +憩 +憬 +憷 +憾 +懂 +懈 +懊 +懋 +懒 +懵 +懿 +戈 +戎 +戏 +成 +我 +戒 +或 +战 +戚 +戛 +戟 +截 +戬 +戮 +戳 +戴 +户 +房 +所 +扁 +扇 +扉 +手 +才 +扎 +扑 +扒 +打 +扔 +托 +扛 +扣 +执 +扩 +扫 +扬 +扭 +扮 +扯 +扰 +扳 +扶 +批 +扼 +找 +承 +技 +抄 +抉 +把 +抑 +抒 +抓 +投 +抖 +抗 +折 +抚 +抛 +抠 +抡 +抢 +护 +报 +抨 +披 +抬 +抱 +抵 +抹 +押 +抽 +抿 +拄 +担 +拆 +拇 +拈 +拉 +拌 +拍 +拎 +拐 +拒 +拓 +拔 +拖 +拗 +拘 +拙 +招 +拜 +拟 +拢 +拣 +拥 +拦 +拧 +拨 +择 +括 +拭 +拮 +拯 +拱 +拳 +拴 +拷 +拼 +拽 +拾 +拿 +持 +挂 +指 +按 +挎 +挑 +挖 +挚 +挛 +挝 +挟 +挠 +挡 +挣 +挤 +挥 +挨 +挪 +挫 +振 +挺 +挽 +捂 +捅 +捆 +捉 +捍 +捎 +捏 +捐 +捕 +捞 +损 +捡 +换 +捣 +捧 +据 +捷 +捺 +捻 +掀 +掂 +授 +掉 +掌 +掏 +掐 +排 +掖 +掘 +掠 +探 +掣 +接 +控 +推 +掩 +措 +掬 +掮 +掰 +掳 +掴 +掷 +掺 +揄 +揉 +揍 +描 +提 +插 +握 +揣 +揩 +揪 +揭 +援 +揶 +揽 +搀 +搁 +搂 +搅 +搏 +搜 +搞 +搡 +搪 +搬 +搭 +携 +搽 +摁 +摄 +摆 +摇 +摊 +摒 +摔 +摘 +摧 +摩 +摸 +摹 +撂 +撇 +撑 +撒 +撕 +撞 +撤 +撩 +撬 +播 +撮 +撰 +撵 +撸 +撼 +擂 +擅 +操 +擎 +擒 +擘 +擞 +擦 +攀 +攒 +攥 +支 +收 +改 +攻 +放 +政 +故 +效 +敌 +敏 +救 +敖 +教 +敛 +敝 +敞 +敢 +散 +敦 +敬 +数 +敲 +整 +敷 +文 +斋 +斌 +斐 +斑 +斓 +斗 +料 +斛 +斜 +斟 +斡 +斤 +斥 +斧 +斩 +断 +斯 +新 +方 +施 +旁 +旅 +旋 +族 +旗 +无 +既 +日 +旦 +旧 +旨 +早 +旬 +旭 +旱 +时 +旷 +旺 +昀 +昂 +昆 +昊 +昌 +明 +昏 +易 +昔 +昕 +昙 +星 +映 +春 +昧 +昨 +昭 +是 +昱 +昵 +昼 +显 +晃 +晋 +晏 +晒 +晓 +晔 +晕 +晖 +晗 +晚 +晟 +晤 +晦 +晨 +普 +景 +晰 +晴 +晶 +智 +晾 +暂 +暄 +暇 +暑 +暖 +暗 +暧 +暨 +暮 +暴 +曙 +曝 +曦 +曰 +曲 +更 +曹 +曼 +曾 +替 +最 +月 +有 +朋 +服 +朐 +朔 +朗 +望 +朝 +期 +朦 +木 +未 +末 +本 +札 +术 +朱 +朴 +朵 +机 +朽 +杀 +杂 +权 +杆 +杉 +李 +杏 +材 +村 +杖 +杜 +杞 +束 +杠 +条 +来 +杨 +杭 +杯 +杰 +杳 +松 +板 +极 +构 +枉 +析 +枕 +林 +枚 +果 +枝 +枞 +枢 +枣 +枪 +枫 +枭 +枯 +架 +枷 +柄 +柏 +某 +染 +柔 +柚 +柜 +柞 +柠 +查 +柬 +柯 +柱 +柳 +柴 +柿 +栅 +标 +栈 +栋 +栏 +树 +栓 +栖 +栗 +校 +株 +样 +核 +根 +格 +栽 +栾 +桂 +桃 +框 +案 +桉 +桌 +桎 +桐 +桑 +桓 +桔 +档 +桥 +桦 +桩 +桶 +梁 +梅 +梓 +梗 +梦 +梧 +梨 +梭 +梯 +械 +梳 +梵 +检 +棉 +棋 +棍 +棒 +棕 +棘 +棚 +棠 +森 +棱 +棵 +棺 +椅 +椋 +植 +椎 +椒 +椰 +椿 +楂 +楔 +楚 +楞 +楠 +楣 +楷 +楼 +概 +榄 +榆 +榈 +榉 +榔 +榕 +榜 +榨 +榭 +榴 +榷 +榻 +槌 +槎 +槐 +槛 +槟 +槽 +槿 +樊 +樟 +模 +横 +樱 +橄 +橘 +橙 +橡 +橱 +檀 +檐 +檬 +欠 +次 +欢 +欣 +欧 +欲 +欺 +款 +歆 +歇 +歉 +歌 +止 +正 +此 +步 +武 +歧 +歪 +歹 +死 +殃 +殆 +殉 +殊 +残 +殒 +殓 +殖 +殚 +殡 +殭 +殴 +段 +殷 +殿 +毁 +毂 +毅 +毋 +母 +每 +毒 +毓 +比 +毕 +毗 +毙 +毛 +毫 +毯 +毽 +氏 +民 +氓 +气 +氛 +氟 +氢 +氦 +氧 +氨 +氪 +氮 +氯 +氰 +水 +永 +氾 +汀 +汁 +求 +汇 +汉 +汕 +汗 +汛 +汝 +汞 +江 +池 +污 +汤 +汪 +汰 +汲 +汴 +汶 +汹 +汽 +汾 +沁 +沂 +沃 +沅 +沈 +沉 +沏 +沐 +沓 +沙 +沛 +沟 +没 +沣 +沥 +沦 +沧 +沪 +沫 +沮 +沱 +河 +沸 +油 +治 +沼 +沽 +沾 +沿 +泄 +泉 +泊 +泌 +泓 +泔 +法 +泗 +泛 +泞 +泠 +泡 +波 +泣 +泥 +注 +泪 +泯 +泰 +泱 +泳 +泵 +泷 +泸 +泻 +泼 +泽 +泾 +洁 +洋 +洒 +洗 +洙 +洛 +洞 +津 +洪 +洱 +洲 +洵 +活 +洼 +洽 +派 +流 +浅 +浆 +浇 +浈 +浊 +测 +济 +浏 +浑 +浓 +浙 +浚 +浦 +浩 +浪 +浮 +浴 +海 +浸 +涂 +涅 +消 +涉 +涌 +涎 +涓 +涕 +涛 +涝 +涞 +涟 +涠 +涡 +涤 +润 +涧 +涨 +涩 +涮 +涯 +液 +涵 +涿 +淀 +淄 +淆 +淇 +淋 +淌 +淑 +淖 +淘 +淝 +淞 +淡 +淤 +淫 +淮 +深 +淳 +混 +淹 +添 +淼 +渀 +清 +渊 +渍 +渎 +渐 +渔 +渗 +渚 +渝 +渠 +渡 +渣 +渤 +渥 +温 +渭 +港 +渲 +渴 +游 +渺 +湃 +湄 +湍 +湖 +湘 +湛 +湾 +湿 +溃 +溅 +溉 +源 +溜 +溢 +溥 +溧 +溪 +溯 +溶 +溺 +滁 +滇 +滋 +滑 +滔 +滕 +滚 +滞 +满 +滢 +滤 +滥 +滨 +滩 +滴 +漂 +漆 +漏 +漓 +演 +漕 +漠 +漩 +漫 +漭 +漯 +漱 +漳 +漾 +潇 +潘 +潜 +潞 +潢 +潦 +潭 +潮 +潼 +澄 +澈 +澎 +澜 +澡 +澳 +激 +濑 +濒 +濠 +濡 +濮 +瀑 +瀚 +瀛 +灌 +灞 +火 +灭 +灯 +灰 +灵 +灶 +灸 +灼 +灾 +灿 +炅 +炉 +炊 +炎 +炒 +炕 +炖 +炙 +炜 +炫 +炬 +炭 +炮 +炯 +炳 +炷 +炸 +点 +炼 +炽 +烁 +烂 +烃 +烈 +烊 +烘 +烙 +烛 +烟 +烤 +烦 +烧 +烨 +烫 +热 +烯 +烷 +烹 +烽 +焉 +焊 +焕 +焖 +焘 +焚 +焦 +焯 +焰 +焱 +然 +煊 +煌 +煎 +煜 +煞 +煤 +煦 +照 +煮 +煲 +熄 +熊 +熏 +熔 +熙 +熟 +熠 +熨 +熬 +熹 +燃 +燊 +燎 +燕 +燥 +爆 +爪 +爬 +爱 +爵 +父 +爷 +爸 +爹 +爽 +片 +版 +牌 +牙 +牛 +牟 +牡 +牢 +牧 +物 +牲 +牵 +特 +牺 +牾 +犀 +犁 +犄 +犊 +犒 +犬 +犯 +状 +犷 +犹 +狂 +狄 +狈 +狐 +狒 +狗 +狙 +狞 +狠 +狡 +狩 +独 +狭 +狮 +狰 +狱 +狸 +狼 +猎 +猖 +猛 +猜 +猝 +猥 +猩 +猪 +猫 +猬 +献 +猴 +猾 +猿 +獒 +獗 +獾 +玄 +率 +玉 +王 +玖 +玛 +玟 +玥 +玩 +玫 +玮 +环 +现 +玲 +玳 +玺 +玻 +珀 +珉 +珊 +珍 +珏 +珑 +珜 +珠 +班 +珮 +珲 +珺 +球 +琅 +理 +琉 +琊 +琏 +琐 +琛 +琢 +琥 +琦 +琨 +琪 +琬 +琰 +琳 +琴 +琵 +琶 +琼 +瑁 +瑄 +瑕 +瑙 +瑚 +瑛 +瑜 +瑞 +瑟 +瑰 +瑶 +瑾 +璀 +璃 +璇 +璋 +璐 +璞 +璧 +璨 +瓜 +瓢 +瓣 +瓦 +瓮 +瓯 +瓶 +瓷 +甄 +甘 +甚 +甜 +生 +甥 +用 +甩 +甫 +甬 +甯 +田 +由 +甲 +申 +电 +男 +甸 +町 +画 +畅 +畊 +界 +畏 +畔 +留 +畜 +略 +番 +畴 +畸 +畿 +疃 +疆 +疏 +疑 +疗 +疚 +疝 +疤 +疫 +疯 +疲 +疵 +疹 +疼 +疾 +病 +症 +痉 +痊 +痒 +痕 +痘 +痛 +痣 +痪 +痫 +痰 +痱 +痴 +痹 +痼 +瘀 +瘁 +瘟 +瘠 +瘤 +瘦 +瘩 +瘪 +瘫 +瘸 +瘾 +癌 +癖 +癣 +癫 +登 +白 +百 +皂 +的 +皆 +皇 +皋 +皎 +皓 +皖 +皙 +皮 +皱 +盆 +盈 +益 +盎 +盐 +监 +盒 +盔 +盖 +盗 +盘 +盛 +盟 +目 +盯 +盲 +直 +相 +盹 +盼 +盾 +省 +眈 +眉 +看 +真 +眠 +眨 +眬 +眯 +眶 +眷 +眺 +眼 +着 +睁 +睐 +睛 +睡 +督 +睦 +睫 +睬 +睹 +睾 +睿 +瞄 +瞅 +瞌 +瞎 +瞒 +瞟 +瞧 +瞩 +瞪 +瞬 +瞰 +瞳 +瞻 +瞿 +矗 +矛 +矜 +矢 +矣 +知 +矩 +矫 +短 +矮 +石 +矶 +矸 +矿 +码 +砂 +砌 +砍 +砒 +研 +砖 +砚 +砝 +砥 +砰 +砲 +破 +砷 +砸 +砺 +砾 +础 +硅 +硕 +硚 +硝 +硫 +硬 +确 +碉 +碌 +碍 +碎 +碑 +碗 +碘 +碚 +碟 +碧 +碰 +碱 +碳 +碴 +碾 +磁 +磅 +磊 +磋 +磐 +磕 +磡 +磨 +磴 +磷 +磺 +礁 +示 +礼 +社 +祁 +祈 +祉 +祖 +祛 +祝 +神 +祠 +祢 +祥 +票 +祭 +祯 +祷 +祸 +祺 +禀 +禁 +禄 +禅 +福 +禧 +禹 +禺 +离 +禽 +禾 +秀 +私 +秃 +秆 +秉 +秋 +种 +科 +秒 +秘 +租 +秣 +秤 +秦 +秧 +秩 +积 +称 +秸 +移 +秽 +稀 +程 +稍 +税 +稚 +稠 +稣 +稳 +稻 +稼 +稽 +稿 +穆 +穗 +穴 +究 +穷 +空 +穿 +突 +窃 +窄 +窈 +窍 +窑 +窒 +窕 +窖 +窗 +窘 +窜 +窝 +窟 +窥 +窦 +窨 +窿 +立 +竖 +站 +竞 +竟 +章 +竣 +童 +竭 +端 +竲 +竹 +竺 +竽 +竿 +笃 +笈 +笋 +笑 +笔 +笙 +笛 +符 +笨 +第 +笼 +等 +筋 +筏 +筐 +筑 +筒 +答 +策 +筛 +筱 +筵 +筷 +筹 +签 +简 +箍 +箔 +箕 +算 +管 +箫 +箭 +箱 +篇 +篡 +篪 +篮 +篷 +簇 +簧 +簸 +簿 +籁 +籍 +米 +类 +籽 +粉 +粒 +粕 +粗 +粘 +粟 +粤 +粥 +粪 +粮 +粱 +粹 +粽 +精 +糊 +糕 +糖 +糗 +糙 +糟 +糯 +系 +紊 +素 +索 +紧 +紫 +累 +絮 +綦 +繁 +纠 +红 +纣 +纤 +约 +级 +纪 +纬 +纯 +纰 +纱 +纲 +纳 +纵 +纶 +纷 +纸 +纹 +纺 +纽 +线 +练 +组 +绅 +细 +织 +终 +绊 +绌 +绍 +绎 +经 +绑 +绒 +结 +绕 +绘 +给 +绚 +络 +绝 +绞 +统 +绢 +绣 +继 +绩 +绪 +续 +绮 +绯 +绰 +绳 +维 +绵 +绷 +绸 +综 +绽 +绿 +缀 +缄 +缅 +缆 +缇 +缉 +缓 +缔 +缕 +编 +缘 +缙 +缚 +缜 +缝 +缠 +缤 +缨 +缩 +缪 +缭 +缮 +缰 +缴 +缸 +缺 +罂 +罄 +罐 +网 +罕 +罗 +罚 +罡 +罢 +罩 +罪 +置 +署 +罹 +羁 +羊 +美 +羔 +羚 +羞 +羡 +羣 +群 +羲 +羹 +羽 +羿 +翁 +翅 +翌 +翔 +翘 +翟 +翠 +翡 +翩 +翰 +翱 +翻 +翼 +耀 +老 +考 +耄 +者 +耋 +而 +耍 +耐 +耒 +耕 +耗 +耘 +耳 +耶 +耷 +耸 +耻 +耽 +耿 +聂 +聆 +聊 +聋 +职 +联 +聘 +聚 +聪 +肃 +肆 +肇 +肉 +肋 +肌 +肖 +肘 +肚 +肛 +肝 +肠 +股 +肢 +肤 +肥 +肩 +肪 +肮 +肯 +育 +肴 +肺 +肾 +肿 +胀 +胁 +胃 +胆 +背 +胎 +胖 +胚 +胛 +胜 +胞 +胡 +胤 +胧 +胫 +胯 +胰 +胱 +胳 +胶 +胸 +胺 +能 +脂 +脆 +脉 +脊 +脍 +脏 +脐 +脑 +脖 +脚 +脯 +脱 +脸 +脾 +腆 +腊 +腋 +腌 +腐 +腑 +腓 +腔 +腕 +腥 +腩 +腮 +腰 +腱 +腹 +腺 +腻 +腼 +腾 +腿 +膀 +膊 +膏 +膑 +膛 +膜 +膝 +膨 +膳 +膺 +臀 +臂 +臃 +臆 +臣 +自 +臭 +至 +致 +臻 +舀 +舅 +舆 +舌 +舍 +舒 +舛 +舜 +舞 +舟 +航 +般 +舰 +舱 +舵 +舶 +舸 +船 +艇 +艋 +艘 +良 +艰 +色 +艳 +艺 +艾 +节 +芊 +芋 +芒 +芙 +芜 +芝 +芦 +芪 +芬 +芭 +芮 +芯 +花 +芳 +芷 +芸 +芽 +苇 +苍 +苏 +苑 +苗 +苛 +苟 +苡 +苣 +若 +苦 +苯 +英 +苹 +茁 +茂 +范 +茄 +茅 +茆 +茎 +茗 +茜 +茨 +茫 +茬 +茵 +茶 +茸 +茹 +荃 +荆 +荇 +草 +荐 +荒 +荔 +荚 +荞 +荟 +荡 +荣 +荤 +荧 +荫 +药 +荷 +荼 +莅 +莆 +莉 +莎 +莓 +莘 +莞 +莠 +莫 +莱 +莲 +莴 +获 +莹 +莺 +莽 +菁 +菇 +菊 +菌 +菜 +菠 +菡 +菩 +菱 +菲 +萃 +萄 +萋 +萌 +萍 +萎 +萝 +萤 +营 +萦 +萧 +萨 +萱 +落 +葆 +著 +葛 +葡 +董 +葩 +葫 +葬 +葱 +葵 +蒂 +蒋 +蒙 +蒜 +蒲 +蒸 +蒿 +蓁 +蓄 +蓉 +蓝 +蓟 +蓬 +蔑 +蔓 +蔗 +蔚 +蔡 +蔫 +蔬 +蔷 +蔺 +蔽 +蕉 +蕊 +蕙 +蕲 +蕴 +蕾 +薄 +薇 +薙 +薛 +薪 +薯 +薰 +藏 +藜 +藤 +藩 +藻 +蘑 +虎 +虏 +虐 +虑 +虚 +虞 +虫 +虱 +虹 +虽 +虾 +蚀 +蚁 +蚂 +蚊 +蚌 +蚓 +蚕 +蚝 +蚣 +蚯 +蛀 +蛆 +蛇 +蛋 +蛐 +蛙 +蛛 +蛟 +蛮 +蛰 +蜀 +蜂 +蜇 +蜈 +蜊 +蜒 +蜓 +蜕 +蜗 +蜘 +蜚 +蜜 +蜡 +蜥 +蜴 +蜷 +蜻 +蜿 +蝇 +蝉 +蝎 +蝗 +蝙 +蝠 +蝴 +蝶 +螂 +螃 +融 +螳 +螺 +蟀 +蟋 +蟑 +蟒 +蟹 +蠕 +蠢 +血 +衅 +行 +衍 +衔 +街 +衙 +衡 +衣 +补 +表 +衫 +衬 +衰 +衷 +袁 +袂 +袄 +袆 +袈 +袋 +袍 +袒 +袖 +袜 +被 +袭 +袱 +裁 +裂 +装 +裆 +裔 +裕 +裙 +裟 +裤 +裳 +裴 +裸 +裹 +褂 +褒 +褓 +褚 +褛 +褪 +褴 +褶 +襁 +襄 +襟 +西 +要 +覃 +覆 +见 +观 +规 +觅 +视 +览 +觉 +觊 +觎 +觐 +觑 +角 +解 +觥 +触 +言 +詹 +誉 +誓 +警 +譬 +计 +订 +认 +讧 +讨 +让 +讪 +训 +议 +讯 +记 +讲 +讳 +讶 +许 +讹 +论 +讼 +讽 +设 +访 +诀 +证 +评 +诅 +识 +诈 +诉 +诊 +词 +译 +诓 +试 +诗 +诙 +诚 +话 +诞 +诟 +诠 +诡 +询 +该 +详 +诧 +诩 +诫 +诬 +语 +误 +诱 +诲 +说 +诵 +诶 +请 +诸 +诺 +读 +诽 +课 +诿 +谀 +谁 +调 +谅 +谈 +谊 +谋 +谌 +谍 +谎 +谐 +谑 +谓 +谕 +谙 +谚 +谜 +谢 +谣 +谤 +谦 +谨 +谩 +谬 +谭 +谱 +谴 +谷 +豁 +豆 +豚 +象 +豪 +豫 +豹 +貅 +貉 +貌 +貔 +贝 +贞 +负 +贡 +财 +责 +贤 +败 +账 +货 +质 +贩 +贪 +贫 +贬 +购 +贮 +贯 +贱 +贴 +贵 +贷 +贸 +费 +贺 +贼 +贾 +贿 +赁 +赂 +赃 +资 +赋 +赌 +赎 +赏 +赐 +赔 +赖 +赘 +赚 +赛 +赝 +赞 +赠 +赡 +赢 +赣 +赤 +赦 +赫 +走 +赴 +赵 +赶 +起 +趁 +超 +越 +趋 +趟 +趣 +足 +趴 +趸 +趾 +跃 +跄 +跆 +跌 +跑 +跛 +距 +跟 +跤 +跨 +跪 +路 +跳 +践 +跷 +跺 +跻 +踉 +踊 +踏 +踝 +踞 +踢 +踩 +踪 +踵 +踹 +蹂 +蹄 +蹈 +蹊 +蹚 +蹦 +蹬 +蹭 +蹲 +蹴 +蹶 +蹼 +蹿 +躁 +躏 +身 +躬 +躯 +躲 +躺 +车 +轧 +轨 +轩 +转 +轮 +软 +轰 +轴 +轶 +轻 +载 +轿 +较 +辄 +辅 +辆 +辈 +辉 +辍 +辐 +辑 +输 +辖 +辗 +辘 +辙 +辛 +辜 +辞 +辟 +辣 +辨 +辩 +辫 +辰 +辱 +边 +辽 +达 +迁 +迂 +迄 +迅 +过 +迈 +迎 +运 +近 +返 +还 +这 +进 +远 +违 +连 +迟 +迢 +迥 +迪 +迫 +迭 +述 +迷 +迸 +迹 +追 +退 +送 +适 +逃 +逅 +逆 +选 +逊 +逍 +透 +逐 +递 +途 +逗 +通 +逛 +逝 +逞 +速 +造 +逡 +逢 +逮 +逵 +逸 +逻 +逼 +逾 +遁 +遂 +遇 +遍 +遏 +遐 +道 +遗 +遛 +遢 +遣 +遥 +遨 +遭 +遮 +遴 +遵 +避 +邀 +邂 +邃 +邋 +邑 +邓 +邛 +邝 +邢 +那 +邦 +邪 +邬 +邮 +邯 +邱 +邵 +邹 +邺 +邻 +郁 +郊 +郎 +郑 +郜 +郝 +郡 +部 +郫 +郭 +郸 +都 +鄂 +鄙 +鄞 +鄢 +酋 +酌 +配 +酒 +酗 +酝 +酣 +酪 +酬 +酯 +酱 +酵 +酶 +酷 +酸 +酿 +醇 +醉 +醋 +醍 +醐 +醒 +醛 +采 +釉 +释 +里 +重 +野 +量 +金 +釜 +鉴 +鏖 +鑫 +针 +钉 +钊 +钒 +钓 +钛 +钜 +钝 +钞 +钟 +钠 +钢 +钥 +钦 +钧 +钩 +钮 +钰 +钱 +钴 +钵 +钻 +钾 +铀 +铁 +铂 +铃 +铅 +铆 +铉 +铎 +铐 +铜 +铝 +铠 +铡 +铣 +铨 +铬 +铭 +铮 +铰 +铲 +银 +铸 +铺 +链 +铿 +销 +锁 +锂 +锄 +锅 +锆 +锈 +锋 +锌 +锏 +锐 +错 +锚 +锜 +锟 +锡 +锢 +锣 +锤 +锥 +锦 +锭 +键 +锯 +锰 +锵 +锷 +锹 +锻 +镀 +镁 +镇 +镉 +镊 +镍 +镐 +镑 +镖 +镜 +镯 +镳 +镶 +长 +门 +闪 +闫 +闭 +问 +闯 +闰 +闲 +闳 +间 +闵 +闷 +闸 +闹 +闺 +闻 +闽 +阀 +阁 +阂 +阅 +阎 +阐 +阔 +阙 +阚 +阜 +队 +阮 +阱 +防 +阳 +阴 +阵 +阶 +阻 +阿 +陀 +陂 +附 +际 +陆 +陇 +陈 +陋 +陌 +降 +限 +陕 +陡 +院 +除 +陨 +险 +陪 +陬 +陵 +陶 +陷 +隅 +隆 +隋 +隍 +随 +隐 +隔 +隘 +隙 +障 +隧 +隶 +隼 +隽 +难 +雀 +雁 +雄 +雅 +集 +雇 +雌 +雍 +雏 +雕 +雨 +雪 +雯 +雳 +零 +雷 +雾 +需 +霁 +霄 +霆 +震 +霈 +霉 +霍 +霎 +霏 +霖 +霜 +霞 +露 +霸 +霹 +霾 +靑 +青 +靓 +靖 +静 +靛 +非 +靠 +靡 +面 +革 +靳 +靴 +靶 +鞋 +鞍 +鞘 +鞠 +鞭 +韦 +韧 +韩 +韬 +音 +韵 +韶 +页 +顶 +顷 +项 +顺 +须 +顽 +顾 +顿 +颁 +颂 +预 +颅 +领 +颇 +颈 +颊 +颍 +颐 +频 +颓 +颖 +颗 +题 +颚 +颜 +额 +颠 +颤 +风 +飒 +飓 +飘 +飙 +飚 +飞 +食 +餐 +餮 +饕 +饥 +饪 +饭 +饮 +饰 +饱 +饲 +饵 +饶 +饺 +饼 +饽 +饿 +馀 +馅 +馆 +馈 +馊 +馋 +馑 +馒 +首 +馗 +香 +馥 +馨 +马 +驭 +驯 +驰 +驱 +驳 +驴 +驶 +驻 +驼 +驾 +驿 +骁 +骂 +骄 +骅 +骆 +骇 +骊 +骋 +验 +骏 +骐 +骑 +骗 +骚 +骜 +骤 +骥 +骨 +骷 +骸 +骼 +髅 +髋 +髌 +髓 +高 +髦 +鬼 +魁 +魂 +魄 +魅 +魇 +魏 +魔 +鱼 +鲁 +鲍 +鲜 +鲟 +鲤 +鲨 +鲶 +鲷 +鲸 +鳄 +鳅 +鳌 +鳖 +鳝 +鳞 +鸟 +鸠 +鸡 +鸣 +鸥 +鸦 +鸭 +鸯 +鸳 +鸵 +鸽 +鸾 +鸿 +鹃 +鹅 +鹊 +鹏 +鹜 +鹞 +鹤 +鹭 +鹰 +鹿 +麋 +麒 +麓 +麟 +麦 +麻 +麾 +黄 +黍 +黎 +黏 +黑 +黔 +默 +黛 +黝 +黯 +鼎 +鼓 +鼠 +鼻 +鼾 +齐 +齿 +龄 +龙 +龚 +龟 +a +c +k +t + diff --git a/modules/audio/asr/deepspeech2_aishell/deepspeech_tester.py b/modules/audio/asr/deepspeech2_aishell/deepspeech_tester.py new file mode 100644 index 00000000..6b1f8975 --- /dev/null +++ b/modules/audio/asr/deepspeech2_aishell/deepspeech_tester.py @@ -0,0 +1,81 @@ +# Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved. +# +# 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. +"""Evaluation for DeepSpeech2 model.""" +import os +import sys +from pathlib import Path + +import paddle + +from deepspeech.frontend.featurizer.text_featurizer import TextFeaturizer +from deepspeech.io.collator import SpeechCollator +from deepspeech.models.ds2 import DeepSpeech2Model +from deepspeech.utils import mp_tools +from deepspeech.utils.utility import UpdateConfig + + +class DeepSpeech2Tester: + def __init__(self, config): + self.config = config + self.collate_fn_test = SpeechCollator.from_config(config) + self._text_featurizer = TextFeaturizer(unit_type=config.collator.unit_type, vocab_filepath=None) + + def compute_result_transcripts(self, audio, audio_len, vocab_list, cfg): + result_transcripts = self.model.decode( + audio, + audio_len, + vocab_list, + decoding_method=cfg.decoding_method, + lang_model_path=cfg.lang_model_path, + beam_alpha=cfg.alpha, + beam_beta=cfg.beta, + beam_size=cfg.beam_size, + cutoff_prob=cfg.cutoff_prob, + cutoff_top_n=cfg.cutoff_top_n, + num_processes=cfg.num_proc_bsearch) + #replace the '' with ' ' + result_transcripts = [self._text_featurizer.detokenize(sentence) for sentence in result_transcripts] + + return result_transcripts + + @mp_tools.rank_zero_only + @paddle.no_grad() + def test(self, audio_file): + self.model.eval() + cfg = self.config + collate_fn_test = self.collate_fn_test + audio, _ = collate_fn_test.process_utterance(audio_file=audio_file, transcript=" ") + audio_len = audio.shape[0] + audio = paddle.to_tensor(audio, dtype='float32') + audio_len = paddle.to_tensor(audio_len) + audio = paddle.unsqueeze(audio, axis=0) + vocab_list = collate_fn_test.vocab_list + result_transcripts = self.compute_result_transcripts(audio, audio_len, vocab_list, cfg.decoding) + return result_transcripts + + def setup_model(self): + config = self.config.clone() + with UpdateConfig(config): + config.model.feat_size = self.collate_fn_test.feature_size + config.model.dict_size = self.collate_fn_test.vocab_size + + model = DeepSpeech2Model.from_config(config.model) + self.model = model + + def resume(self, checkpoint): + """Resume from the checkpoint at checkpoints in the output + directory or load a specified checkpoint. + """ + model_dict = paddle.load(checkpoint) + self.model.set_state_dict(model_dict) diff --git a/modules/audio/asr/deepspeech2_aishell/module.py b/modules/audio/asr/deepspeech2_aishell/module.py new file mode 100644 index 00000000..3e18e4b0 --- /dev/null +++ b/modules/audio/asr/deepspeech2_aishell/module.py @@ -0,0 +1,92 @@ +# Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved. +# +# 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. + +import os +from pathlib import Path +import sys + +import numpy as np +from paddlehub.env import MODULE_HOME +from paddlehub.module.module import moduleinfo, serving +from paddlehub.utils.log import logger +from paddle.utils.download import get_path_from_url + +try: + import swig_decoders +except ModuleNotFoundError as e: + logger.error(e) + logger.info('The module requires additional dependencies: swig_decoders. ' + 'please install via:\n\'git clone https://github.com/PaddlePaddle/DeepSpeech.git ' + '&& cd DeepSpeech && git reset --hard b53171694e7b87abe7ea96870b2f4d8e0e2b1485 ' + '&& cd deepspeech/decoders/ctcdecoder/swig && sh setup.sh\'') + sys.exit(1) + +import paddle +import soundfile as sf + +# TODO: Remove system path when deepspeech can be installed via pip. +sys.path.append(os.path.join(MODULE_HOME, 'deepspeech2_aishell')) +from deepspeech.exps.deepspeech2.config import get_cfg_defaults +from deepspeech.utils.utility import UpdateConfig +from .deepspeech_tester import DeepSpeech2Tester + +LM_URL = 'https://deepspeech.bj.bcebos.com/zh_lm/zh_giga.no_cna_cmn.prune01244.klm' +LM_MD5 = '29e02312deb2e59b3c8686c7966d4fe3' + + +@moduleinfo(name="deepspeech2_aishell", version="1.0.0", summary="", author="Baidu", author_email="", type="audio/asr") +class DeepSpeech2(paddle.nn.Layer): + def __init__(self): + super(DeepSpeech2, self).__init__() + + # resource + res_dir = os.path.join(MODULE_HOME, 'deepspeech2_aishell', 'assets') + conf_file = os.path.join(res_dir, 'conf/deepspeech2.yaml') + checkpoint = os.path.join(res_dir, 'checkpoints/avg_1.pdparams') + # Download LM manually cause its large size. + lm_path = os.path.join(res_dir, 'data', 'lm') + lm_file = os.path.join(lm_path, LM_URL.split('/')[-1]) + if not os.path.isfile(lm_file): + logger.info(f'Downloading lm from {LM_URL}.') + get_path_from_url(url=LM_URL, root_dir=lm_path, md5sum=LM_MD5) + + # config + self.model_type = 'offline' + self.config = get_cfg_defaults(self.model_type) + self.config.merge_from_file(conf_file) + + # TODO: Remove path updating snippet. + with UpdateConfig(self.config): + self.config.collator.mean_std_filepath = os.path.join(res_dir, self.config.collator.mean_std_filepath) + self.config.collator.vocab_filepath = os.path.join(res_dir, self.config.collator.vocab_filepath) + self.config.collator.augmentation_config = os.path.join(res_dir, self.config.collator.augmentation_config) + self.config.decoding.lang_model_path = os.path.join(res_dir, self.config.decoding.lang_model_path) + + # model + self.tester = DeepSpeech2Tester(self.config) + self.tester.setup_model() + self.tester.resume(checkpoint) + + @staticmethod + def check_audio(audio_file): + sig, sample_rate = sf.read(audio_file) + assert sample_rate == 16000, 'Excepting sample rate of input audio is 16000, but got {}'.format(sample_rate) + + @serving + def speech_recognize(self, audio_file, device='cpu'): + assert os.path.isfile(audio_file), 'File not exists: {}'.format(audio_file) + self.check_audio(audio_file) + + paddle.set_device(device) + return self.tester.test(audio_file)[0] diff --git a/modules/audio/asr/deepspeech2_aishell/requirements.txt b/modules/audio/asr/deepspeech2_aishell/requirements.txt new file mode 100644 index 00000000..e6f929d0 --- /dev/null +++ b/modules/audio/asr/deepspeech2_aishell/requirements.txt @@ -0,0 +1,12 @@ +# system level: libsnd swig +loguru +yacs +jsonlines +scipy==1.2.1 +sentencepiece +resampy==0.2.2 +SoundFile==0.9.0.post1 +soxbindings +kaldiio +typeguard +editdistance diff --git a/modules/audio/asr/deepspeech2_librispeech/README.md b/modules/audio/asr/deepspeech2_librispeech/README.md new file mode 100644 index 00000000..a7d4aee0 --- /dev/null +++ b/modules/audio/asr/deepspeech2_librispeech/README.md @@ -0,0 +1,153 @@ +# deepspeech2_librispeech + +|模型名称|deepspeech2_librispeech| +| :--- | :---: | +|类别|语音-语音识别| +|网络|DeepSpeech2| +|数据集|LibriSpeech| +|是否支持Fine-tuning|否| +|模型大小|518MB| +|最新更新日期|2021-10-20| +|数据指标|英文WER 0.072| + +## 一、模型基本信息 + +### 模型介绍 + +DeepSpeech2是百度于2015年提出的适用于英文和中文的end-to-end语音识别模型。deepspeech2_librispeech使用了DeepSpeech2离线模型的结构,模型主要由2层卷积网络和3层GRU组成,并在英文开源语音数据集[LibriSpeech ASR corpus](http://www.openslr.org/12/)进行了预训练,该模型在其测试集上的WER指标是0.072。 + + +

+
+

+ +更多详情请参考[Deep Speech 2: End-to-End Speech Recognition in English and Mandarin](https://arxiv.org/abs/1512.02595) + +## 二、安装 + +- ### 1、系统依赖 + + - libsndfile, swig >= 3.0 + - Linux + ```shell + $ sudo apt-get install libsndfile swig + or + $ sudo yum install libsndfile swig + ``` + - MacOs + ``` + $ brew install libsndfile swig + ``` + +- ### 2、环境依赖 + - swig_decoder: + ``` + git clone https://github.com/paddlepaddle/deepspeech && cd DeepSpeech && git reset --hard b53171694e7b87abe7ea96870b2f4d8e0e2b1485 && cd deepspeech/decoders/ctcdecoder/swig && sh setup.sh + ``` + + - paddlepaddle >= 2.1.0 + + - paddlehub >= 2.1.0 | [如何安装PaddleHub](../../../../docs/docs_ch/get_start/installation.rst) + +- ### 3、安装 + + - ```shell + $ hub install deepspeech2_librispeech + ``` + - 如您安装时遇到问题,可参考:[零基础windows安装](../../../../docs/docs_ch/get_start/windows_quickstart.md) + | [零基础Linux安装](../../../../docs/docs_ch/get_start/linux_quickstart.md) | [零基础MacOS安装](../../../../docs/docs_ch/get_start/mac_quickstart.md) + + +## 三、模型API预测 + +- ### 1、预测代码示例 + + ```python + import paddlehub as hub + + # 采样率为16k,格式为wav的英文语音音频 + wav_file = '/PATH/TO/AUDIO' + + model = hub.Module( + name='deepspeech2_librispeech', + version='1.0.0') + text = model.speech_recognize(wav_file) + + print(text) + ``` + +- ### 2、API + - ```python + def check_audio(audio_file) + ``` + - 检查输入音频格式和采样率是否满足为16000 + + - **参数** + + - `audio_file`:本地音频文件(*.wav)的路径,如`/path/to/input.wav` + + - ```python + def speech_recognize( + audio_file, + device='cpu', + ) + ``` + - 将输入的音频识别成文字 + + - **参数** + + - `audio_file`:本地音频文件(*.wav)的路径,如`/path/to/input.wav` + - `device`:预测时使用的设备,默认为`cpu`,如需使用gpu预测,请设置为`gpu`。 + + - **返回** + + - `text`:str类型,返回输入音频的识别文字结果。 + + +## 四、服务部署 + +- PaddleHub Serving可以部署一个在线的语音识别服务。 + +- ### 第一步:启动PaddleHub Serving + + - ```shell + $ hub serving start -m deepspeech2_librispeech + ``` + + - 这样就完成了一个语音识别服务化API的部署,默认端口号为8866。 + + - **NOTE:** 如使用GPU预测,则需要在启动服务之前,请设置CUDA_VISIBLE_DEVICES环境变量,否则不用设置。 + +- ### 第二步:发送预测请求 + + - 配置好服务端,以下数行代码即可实现发送预测请求,获取预测结果 + + - ```python + import requests + import json + + # 需要识别的音频的存放路径,确保部署服务的机器可访问 + file = '/path/to/input.wav' + + # 以key的方式指定text传入预测方法的时的参数,此例中为"audio_file" + data = {"audio_file": file} + + # 发送post请求,content-type类型应指定json方式,url中的ip地址需改为对应机器的ip + url = "http://127.0.0.1:8866/predict/deepspeech2_librispeech" + + # 指定post请求的headers为application/json方式 + headers = {"Content-Type": "application/json"} + + r = requests.post(url=url, headers=headers, data=json.dumps(data)) + print(r.json()) + ``` + +## 五、更新历史 + +* 1.0.0 + + 初始发布 + + ```shell + $ hub install deepspeech2_librispeech + ``` diff --git a/modules/audio/asr/deepspeech2_librispeech/__init__.py b/modules/audio/asr/deepspeech2_librispeech/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/modules/audio/asr/deepspeech2_librispeech/assets/conf/augmentation.json b/modules/audio/asr/deepspeech2_librispeech/assets/conf/augmentation.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/modules/audio/asr/deepspeech2_librispeech/assets/conf/augmentation.json @@ -0,0 +1 @@ +{} diff --git a/modules/audio/asr/deepspeech2_librispeech/assets/conf/deepspeech2.yaml b/modules/audio/asr/deepspeech2_librispeech/assets/conf/deepspeech2.yaml new file mode 100644 index 00000000..c5c2e466 --- /dev/null +++ b/modules/audio/asr/deepspeech2_librispeech/assets/conf/deepspeech2.yaml @@ -0,0 +1,68 @@ +# https://yaml.org/type/float.html +data: + train_manifest: data/manifest.train + dev_manifest: data/manifest.dev-clean + test_manifest: data/manifest.test-clean + min_input_len: 0.0 + max_input_len: 30.0 # second + min_output_len: 0.0 + max_output_len: .inf + min_output_input_ratio: 0.00 + max_output_input_ratio: .inf + +collator: + batch_size: 20 + mean_std_filepath: data/mean_std.json + unit_type: char + vocab_filepath: data/vocab.txt + augmentation_config: conf/augmentation.json + random_seed: 0 + spm_model_prefix: + spectrum_type: linear + target_sample_rate: 16000 + max_freq: None + n_fft: None + stride_ms: 10.0 + window_ms: 20.0 + delta_delta: False + dither: 1.0 + use_dB_normalization: True + target_dB: -20 + random_seed: 0 + keep_transcription_text: False + sortagrad: True + shuffle_method: batch_shuffle + num_workers: 2 + +model: + num_conv_layers: 2 + num_rnn_layers: 3 + rnn_layer_size: 2048 + use_gru: False + share_rnn_weights: True + blank_id: 0 + ctc_grad_norm_type: instance + +training: + n_epoch: 50 + accum_grad: 1 + lr: 1e-3 + lr_decay: 0.83 + weight_decay: 1e-06 + global_grad_clip: 5.0 + log_interval: 100 + checkpoint: + kbest_n: 50 + latest_n: 5 + +decoding: + batch_size: 128 + error_rate_type: wer + decoding_method: ctc_beam_search + lang_model_path: data/lm/common_crawl_00.prune01111.trie.klm + alpha: 1.9 + beta: 0.3 + beam_size: 500 + cutoff_prob: 1.0 + cutoff_top_n: 40 + num_proc_bsearch: 8 diff --git a/modules/audio/asr/deepspeech2_librispeech/deepspeech_tester.py b/modules/audio/asr/deepspeech2_librispeech/deepspeech_tester.py new file mode 100644 index 00000000..6b1f8975 --- /dev/null +++ b/modules/audio/asr/deepspeech2_librispeech/deepspeech_tester.py @@ -0,0 +1,81 @@ +# Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved. +# +# 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. +"""Evaluation for DeepSpeech2 model.""" +import os +import sys +from pathlib import Path + +import paddle + +from deepspeech.frontend.featurizer.text_featurizer import TextFeaturizer +from deepspeech.io.collator import SpeechCollator +from deepspeech.models.ds2 import DeepSpeech2Model +from deepspeech.utils import mp_tools +from deepspeech.utils.utility import UpdateConfig + + +class DeepSpeech2Tester: + def __init__(self, config): + self.config = config + self.collate_fn_test = SpeechCollator.from_config(config) + self._text_featurizer = TextFeaturizer(unit_type=config.collator.unit_type, vocab_filepath=None) + + def compute_result_transcripts(self, audio, audio_len, vocab_list, cfg): + result_transcripts = self.model.decode( + audio, + audio_len, + vocab_list, + decoding_method=cfg.decoding_method, + lang_model_path=cfg.lang_model_path, + beam_alpha=cfg.alpha, + beam_beta=cfg.beta, + beam_size=cfg.beam_size, + cutoff_prob=cfg.cutoff_prob, + cutoff_top_n=cfg.cutoff_top_n, + num_processes=cfg.num_proc_bsearch) + #replace the '' with ' ' + result_transcripts = [self._text_featurizer.detokenize(sentence) for sentence in result_transcripts] + + return result_transcripts + + @mp_tools.rank_zero_only + @paddle.no_grad() + def test(self, audio_file): + self.model.eval() + cfg = self.config + collate_fn_test = self.collate_fn_test + audio, _ = collate_fn_test.process_utterance(audio_file=audio_file, transcript=" ") + audio_len = audio.shape[0] + audio = paddle.to_tensor(audio, dtype='float32') + audio_len = paddle.to_tensor(audio_len) + audio = paddle.unsqueeze(audio, axis=0) + vocab_list = collate_fn_test.vocab_list + result_transcripts = self.compute_result_transcripts(audio, audio_len, vocab_list, cfg.decoding) + return result_transcripts + + def setup_model(self): + config = self.config.clone() + with UpdateConfig(config): + config.model.feat_size = self.collate_fn_test.feature_size + config.model.dict_size = self.collate_fn_test.vocab_size + + model = DeepSpeech2Model.from_config(config.model) + self.model = model + + def resume(self, checkpoint): + """Resume from the checkpoint at checkpoints in the output + directory or load a specified checkpoint. + """ + model_dict = paddle.load(checkpoint) + self.model.set_state_dict(model_dict) diff --git a/modules/audio/asr/deepspeech2_librispeech/module.py b/modules/audio/asr/deepspeech2_librispeech/module.py new file mode 100644 index 00000000..c05d484f --- /dev/null +++ b/modules/audio/asr/deepspeech2_librispeech/module.py @@ -0,0 +1,93 @@ +# Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved. +# +# 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. + +import os +from pathlib import Path +import sys + +import numpy as np +from paddlehub.env import MODULE_HOME +from paddlehub.module.module import moduleinfo, serving +from paddlehub.utils.log import logger +from paddle.utils.download import get_path_from_url + +try: + import swig_decoders +except ModuleNotFoundError as e: + logger.error(e) + logger.info('The module requires additional dependencies: swig_decoders. ' + 'please install via:\n\'git clone https://github.com/PaddlePaddle/DeepSpeech.git ' + '&& cd DeepSpeech && git reset --hard b53171694e7b87abe7ea96870b2f4d8e0e2b1485 ' + '&& cd deepspeech/decoders/ctcdecoder/swig && sh setup.sh\'') + sys.exit(1) + +import paddle +import soundfile as sf + +# TODO: Remove system path when deepspeech can be installed via pip. +sys.path.append(os.path.join(MODULE_HOME, 'deepspeech2_librispeech')) +from deepspeech.exps.deepspeech2.config import get_cfg_defaults +from deepspeech.utils.utility import UpdateConfig +from .deepspeech_tester import DeepSpeech2Tester + +LM_URL = 'https://deepspeech.bj.bcebos.com/en_lm/common_crawl_00.prune01111.trie.klm' +LM_MD5 = '099a601759d467cd0a8523ff939819c5' + + +@moduleinfo( + name="deepspeech2_librispeech", version="1.0.0", summary="", author="Baidu", author_email="", type="audio/asr") +class DeepSpeech2(paddle.nn.Layer): + def __init__(self): + super(DeepSpeech2, self).__init__() + + # resource + res_dir = os.path.join(MODULE_HOME, 'deepspeech2_librispeech', 'assets') + conf_file = os.path.join(res_dir, 'conf/deepspeech2.yaml') + checkpoint = os.path.join(res_dir, 'checkpoints/avg_1.pdparams') + # Download LM manually cause its large size. + lm_path = os.path.join(res_dir, 'data', 'lm') + lm_file = os.path.join(lm_path, LM_URL.split('/')[-1]) + if not os.path.isfile(lm_file): + logger.info(f'Downloading lm from {LM_URL}.') + get_path_from_url(url=LM_URL, root_dir=lm_path, md5sum=LM_MD5) + + # config + self.model_type = 'offline' + self.config = get_cfg_defaults(self.model_type) + self.config.merge_from_file(conf_file) + + # TODO: Remove path updating snippet. + with UpdateConfig(self.config): + self.config.collator.mean_std_filepath = os.path.join(res_dir, self.config.collator.mean_std_filepath) + self.config.collator.vocab_filepath = os.path.join(res_dir, self.config.collator.vocab_filepath) + self.config.collator.augmentation_config = os.path.join(res_dir, self.config.collator.augmentation_config) + self.config.decoding.lang_model_path = os.path.join(res_dir, self.config.decoding.lang_model_path) + + # model + self.tester = DeepSpeech2Tester(self.config) + self.tester.setup_model() + self.tester.resume(checkpoint) + + @staticmethod + def check_audio(audio_file): + sig, sample_rate = sf.read(audio_file) + assert sample_rate == 16000, 'Excepting sample rate of input audio is 16000, but got {}'.format(sample_rate) + + @serving + def speech_recognize(self, audio_file, device='cpu'): + assert os.path.isfile(audio_file), 'File not exists: {}'.format(audio_file) + self.check_audio(audio_file) + + paddle.set_device(device) + return self.tester.test(audio_file)[0] diff --git a/modules/audio/asr/deepspeech2_librispeech/requirements.txt b/modules/audio/asr/deepspeech2_librispeech/requirements.txt new file mode 100644 index 00000000..66d8ba6c --- /dev/null +++ b/modules/audio/asr/deepspeech2_librispeech/requirements.txt @@ -0,0 +1,11 @@ +loguru +yacs +jsonlines +scipy==1.2.1 +sentencepiece +resampy==0.2.2 +SoundFile==0.9.0.post1 +soxbindings +kaldiio +typeguard +editdistance diff --git a/modules/audio/asr/u2_conformer_aishell/README.md b/modules/audio/asr/u2_conformer_aishell/README.md new file mode 100644 index 00000000..bd0bc64f --- /dev/null +++ b/modules/audio/asr/u2_conformer_aishell/README.md @@ -0,0 +1,156 @@ +# u2_conformer_aishell + +|模型名称|u2_conformer_aishell| +| :--- | :---: | +|类别|语音-语音识别| +|网络|DeepSpeech2| +|数据集|AISHELL-1| +|是否支持Fine-tuning|否| +|模型大小|284MB| +|最新更新日期|2021-11-01| +|数据指标|中文CER 0.055| + +## 一、模型基本信息 + +### 模型介绍 + +U2 Conformer模型是一种适用于英文和中文的end-to-end语音识别模型。u2_conformer_aishell采用了conformer的encoder和transformer的decoder的模型结构,并且使用了ctc-prefix beam search的方式进行一遍打分,再利用attention decoder进行二次打分的方式进行解码来得到最终结果。 + +u2_conformer_aishell在中文普通话开源语音数据集[AISHELL-1](http://www.aishelltech.com/kysjcp)进行了预训练,该模型在其测试集上的CER指标是0.055257。 + +

+
+

+ +

+
+

+ +更多详情请参考: +- [Unified Streaming and Non-streaming Two-pass End-to-end Model for Speech Recognition](https://arxiv.org/abs/2012.05481) +- [Conformer: Convolution-augmented Transformer for Speech Recognition](https://arxiv.org/abs/2005.08100) + +## 二、安装 + +- ### 1、系统依赖 + + - libsndfile + - Linux + ```shell + $ sudo apt-get install libsndfile + or + $ sudo yum install libsndfile + ``` + - MacOs + ``` + $ brew install libsndfile + ``` + +- ### 2、环境依赖 + + - paddlepaddle >= 2.1.0 + + - paddlehub >= 2.1.0 | [如何安装PaddleHub](../../../../docs/docs_ch/get_start/installation.rst) + +- ### 3、安装 + + - ```shell + $ hub install u2_conformer_aishell + ``` + - 如您安装时遇到问题,可参考:[零基础windows安装](../../../../docs/docs_ch/get_start/windows_quickstart.md) + | [零基础Linux安装](../../../../docs/docs_ch/get_start/linux_quickstart.md) | [零基础MacOS安装](../../../../docs/docs_ch/get_start/mac_quickstart.md) + + +## 三、模型API预测 + +- ### 1、预测代码示例 + + ```python + import paddlehub as hub + + # 采样率为16k,格式为wav的中文语音音频 + wav_file = '/PATH/TO/AUDIO' + + model = hub.Module( + name='u2_conformer_aishell', + version='1.0.0') + text = model.speech_recognize(wav_file) + + print(text) + ``` + +- ### 2、API + - ```python + def check_audio(audio_file) + ``` + - 检查输入音频格式和采样率是否满足为16000 + + - **参数** + + - `audio_file`:本地音频文件(*.wav)的路径,如`/path/to/input.wav` + + - ```python + def speech_recognize( + audio_file, + device='cpu', + ) + ``` + - 将输入的音频识别成文字 + + - **参数** + + - `audio_file`:本地音频文件(*.wav)的路径,如`/path/to/input.wav` + - `device`:预测时使用的设备,默认为`cpu`,如需使用gpu预测,请设置为`gpu`。 + + - **返回** + + - `text`:str类型,返回输入音频的识别文字结果。 + + +## 四、服务部署 + +- PaddleHub Serving可以部署一个在线的语音识别服务。 + +- ### 第一步:启动PaddleHub Serving + + - ```shell + $ hub serving start -m u2_conformer_aishell + ``` + + - 这样就完成了一个语音识别服务化API的部署,默认端口号为8866。 + + - **NOTE:** 如使用GPU预测,则需要在启动服务之前,请设置CUDA_VISIBLE_DEVICES环境变量,否则不用设置。 + +- ### 第二步:发送预测请求 + + - 配置好服务端,以下数行代码即可实现发送预测请求,获取预测结果 + + - ```python + import requests + import json + + # 需要识别的音频的存放路径,确保部署服务的机器可访问 + file = '/path/to/input.wav' + + # 以key的方式指定text传入预测方法的时的参数,此例中为"audio_file" + data = {"audio_file": file} + + # 发送post请求,content-type类型应指定json方式,url中的ip地址需改为对应机器的ip + url = "http://127.0.0.1:8866/predict/u2_conformer_aishell" + + # 指定post请求的headers为application/json方式 + headers = {"Content-Type": "application/json"} + + r = requests.post(url=url, headers=headers, data=json.dumps(data)) + print(r.json()) + ``` + +## 五、更新历史 + +* 1.0.0 + + 初始发布 + + ```shell + $ hub install u2_conformer_aishell + ``` diff --git a/modules/audio/asr/u2_conformer_aishell/__init__.py b/modules/audio/asr/u2_conformer_aishell/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/modules/audio/asr/u2_conformer_aishell/assets/conf/augmentation.json b/modules/audio/asr/u2_conformer_aishell/assets/conf/augmentation.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/modules/audio/asr/u2_conformer_aishell/assets/conf/augmentation.json @@ -0,0 +1 @@ +{} diff --git a/modules/audio/asr/u2_conformer_aishell/assets/conf/conformer.yaml b/modules/audio/asr/u2_conformer_aishell/assets/conf/conformer.yaml new file mode 100644 index 00000000..b6925dfc --- /dev/null +++ b/modules/audio/asr/u2_conformer_aishell/assets/conf/conformer.yaml @@ -0,0 +1,102 @@ +data: + train_manifest: data/manifest.train + dev_manifest: data/manifest.dev + test_manifest: data/manifest.test + min_input_len: 0.5 + max_input_len: 20.0 # second + min_output_len: 0.0 + max_output_len: 400.0 + min_output_input_ratio: 0.05 + max_output_input_ratio: 10.0 + +collator: + vocab_filepath: data/vocab.txt + unit_type: 'char' + spm_model_prefix: '' + augmentation_config: conf/augmentation.json + batch_size: 64 + raw_wav: True # use raw_wav or kaldi feature + spectrum_type: fbank #linear, mfcc, fbank + feat_dim: 80 + delta_delta: False + dither: 1.0 + target_sample_rate: 16000 + max_freq: None + n_fft: None + stride_ms: 10.0 + window_ms: 25.0 + use_dB_normalization: False + target_dB: -20 + random_seed: 0 + keep_transcription_text: False + sortagrad: True + shuffle_method: batch_shuffle + num_workers: 2 + +decoding: + alpha: 2.5 + batch_size: 128 + beam_size: 10 + beta: 0.3 + ctc_weight: 0.0 + cutoff_prob: 1.0 + cutoff_top_n: 0 + decoding_chunk_size: -1 + decoding_method: attention + error_rate_type: cer + lang_model_path: data/lm/common_crawl_00.prune01111.trie.klm + num_decoding_left_chunks: -1 + num_proc_bsearch: 8 + simulate_streaming: False +model: + cmvn_file: data/mean_std.json + cmvn_file_type: json + decoder: transformer + decoder_conf: + attention_heads: 4 + dropout_rate: 0.1 + linear_units: 2048 + num_blocks: 6 + positional_dropout_rate: 0.1 + self_attention_dropout_rate: 0.0 + src_attention_dropout_rate: 0.0 + encoder: conformer + encoder_conf: + activation_type: swish + attention_dropout_rate: 0.0 + attention_heads: 4 + cnn_module_kernel: 15 + dropout_rate: 0.1 + input_layer: conv2d + linear_units: 2048 + normalize_before: True + num_blocks: 12 + output_size: 256 + pos_enc_layer_type: rel_pos + positional_dropout_rate: 0.1 + selfattention_layer_type: rel_selfattn + use_cnn_module: True + input_dim: 0 + model_conf: + ctc_weight: 0.3 + ctc_dropoutrate: 0.0 + ctc_grad_norm_type: instance + length_normalized_loss: False + lsm_weight: 0.1 + output_dim: 0 +training: + accum_grad: 2 + global_grad_clip: 5.0 + log_interval: 100 + n_epoch: 300 + optim: adam + optim_conf: + lr: 0.002 + weight_decay: 1e-06 + scheduler: warmuplr + scheduler_conf: + lr_decay: 1.0 + warmup_steps: 25000 + checkpoint: + kbest_n: 50 + latest_n: 5 diff --git a/modules/audio/asr/u2_conformer_aishell/assets/data/mean_std.json b/modules/audio/asr/u2_conformer_aishell/assets/data/mean_std.json new file mode 100644 index 00000000..fff0005d --- /dev/null +++ b/modules/audio/asr/u2_conformer_aishell/assets/data/mean_std.json @@ -0,0 +1 @@ +{"mean_stat": [533749178.75492024, 537379151.9412827, 553560684.251823, 587164297.7995199, 631868827.5506272, 662598279.7375823, 684377628.7270963, 695391900.076011, 692470493.5234187, 679434068.1698124, 666124153.9164762, 656323498.7897255, 665750586.0282139, 678693518.7836165, 681921713.5434498, 679622373.0941861, 669891550.4909347, 656595089.7941492, 653838531.0994304, 637678601.7858486, 628412248.7348012, 644835299.462052, 638840698.1892803, 646181879.4332589, 639724189.2981818, 642757470.3933163, 637471382.8647255, 642368839.4687729, 643414999.4559816, 647384269.1630985, 649348352.9727564, 649293860.0141628, 650234047.7200857, 654485430.6703687, 660474314.9996675, 667417041.2224753, 673157601.3226709, 675674470.304284, 675124085.6890339, 668017589.4583111, 670061307.6169846, 662625614.6886193, 663144526.4351237, 662504003.7634674, 666413530.1149732, 672263295.5639057, 678483738.2530766, 685387098.3034457, 692570857.529439, 699066050.4399202, 700784878.5879861, 701201520.50868, 702666292.305144, 705443439.2278953, 706070270.9023902, 705988909.8337733, 702843339.0362502, 699318566.4701376, 696089900.3030818, 687559674.541517, 675279201.9502573, 663676352.2301354, 662963751.7464145, 664300133.8414352, 666095384.4212626, 671682092.7777623, 676652386.6696675, 680097668.2490273, 683810023.0071762, 688701544.3655603, 692082724.9923568, 695788849.6782106, 701085780.0070009, 706389529.7959046, 711492753.1344281, 717637923.73355, 719691678.2081754, 715810733.4964175, 696362890.4862831, 604649423.9932467], "var_stat": [5413314850.92017, 5559847287.933615, 6150990253.613769, 6921242242.585692, 7999776708.347419, 8789877370.390867, 9405801233.462742, 9768050110.323652, 9759783206.942099, 9430647265.679018, 9090547056.72849, 8873147345.425886, 9155912918.518642, 9542539953.84679, 9653547618.806402, 9593434792.936714, 9316633026.420147, 8959273999.588833, 8863548125.445953, 8450615911.730164, 8211598033.615433, 8587083872.162145, 8432613574.987708, 8583943640.722399, 8401731458.393406, 8439359231.367369, 8293779802.711447, 8401506934.147289, 8427506949.839874, 8525176341.071184, 8577080109.482346, 8575106681.347283, 8594987363.896849, 8701703698.13697, 8854967559.695303, 9029484499.828356, 9168774993.437275, 9221457044.693224, 9194525496.858181, 8997085233.031223, 9024585998.805922, 8819398159.92156, 8807895653.788486, 8777245867.886335, 8869681168.825321, 9017397167.041729, 9173402827.38027, 9345595113.30765, 9530638054.282673, 9701241750.610865, 9749002220.142677, 9762753891.356327, 9802020174.527405, 9874432300.977995, 9883303068.689241, 9873499335.610315, 9780680890.924107, 9672603363.913414, 9569436761.47915, 9321842521.985804, 8968140697.297707, 8646348638.918655, 8616965457.523136, 8648620220.395298, 8702086138.675117, 8859213220.99842, 8999405313.087536, 9105949447.399998, 9220413227.016796, 9358601578.269663, 9451405873.00428, 9552727080.824707, 9695443509.54488, 9836687193.669691, 9970962418.410656, 10135881535.317768, 10189390919.400673, 10070483257.345238, 9532953296.22076, 7261219636.045063], "frame_num": 54068199} diff --git a/modules/audio/asr/u2_conformer_aishell/assets/data/vocab.txt b/modules/audio/asr/u2_conformer_aishell/assets/data/vocab.txt new file mode 100644 index 00000000..bf3f823b --- /dev/null +++ b/modules/audio/asr/u2_conformer_aishell/assets/data/vocab.txt @@ -0,0 +1,4233 @@ + + +一 +丁 +七 +万 +丈 +三 +上 +下 +不 +与 +丐 +丑 +专 +且 +世 +丘 +丙 +业 +丛 +东 +丝 +丞 +丢 +两 +严 +丧 +个 +丫 +中 +丰 +串 +临 +丸 +丹 +为 +主 +丽 +举 +乃 +久 +么 +义 +之 +乌 +乍 +乎 +乏 +乐 +乒 +乓 +乔 +乖 +乘 +乙 +九 +乞 +也 +习 +乡 +书 +买 +乱 +乳 +乾 +了 +予 +争 +事 +二 +于 +亏 +云 +互 +五 +井 +亚 +些 +亟 +亡 +亢 +交 +亥 +亦 +产 +亨 +亩 +享 +京 +亭 +亮 +亲 +亳 +亵 +人 +亿 +什 +仁 +仄 +仅 +仇 +今 +介 +仍 +从 +仑 +仓 +仔 +仕 +他 +仗 +付 +仙 +仡 +代 +令 +以 +仨 +仪 +们 +仰 +仲 +件 +价 +任 +份 +仿 +企 +伉 +伊 +伍 +伎 +伏 +伐 +休 +众 +优 +伙 +会 +伞 +伟 +传 +伢 +伤 +伦 +伪 +伯 +估 +伴 +伶 +伸 +伺 +似 +伽 +佃 +但 +位 +低 +住 +佐 +佑 +体 +何 +佘 +余 +佛 +作 +佟 +你 +佣 +佩 +佬 +佳 +佶 +佼 +使 +侃 +侄 +侈 +例 +侍 +侑 +侗 +供 +依 +侠 +侣 +侥 +侦 +侧 +侨 +侬 +侮 +侯 +侵 +便 +促 +俄 +俊 +俏 +俐 +俗 +俘 +俚 +保 +俞 +信 +俨 +俩 +俪 +俭 +修 +俯 +俱 +俸 +俺 +俾 +倍 +倒 +倘 +候 +倚 +倜 +借 +倡 +倦 +倩 +倪 +债 +值 +倾 +假 +偏 +做 +停 +健 +偶 +偷 +偿 +傅 +傍 +傥 +储 +催 +傲 +傻 +像 +僚 +僧 +僮 +僵 +僻 +儒 +儿 +兀 +允 +元 +兄 +充 +兆 +先 +光 +克 +免 +兑 +兔 +兖 +党 +兜 +兢 +入 +全 +八 +公 +六 +兰 +共 +关 +兴 +兵 +其 +具 +典 +兹 +养 +兼 +兽 +冀 +内 +冈 +冉 +册 +再 +冒 +冕 +写 +军 +农 +冠 +冤 +冥 +冬 +冯 +冰 +冲 +决 +况 +冶 +冷 +冻 +净 +凄 +准 +凇 +凉 +凋 +凌 +减 +凑 +凝 +几 +凡 +凤 +凭 +凯 +凰 +凳 +凶 +凸 +凹 +出 +击 +函 +凿 +刀 +刁 +刃 +分 +切 +刊 +刑 +划 +列 +刘 +则 +刚 +创 +初 +删 +判 +刨 +利 +别 +刮 +到 +制 +刷 +券 +刹 +刺 +刻 +剁 +剂 +剃 +削 +前 +剐 +剑 +剔 +剖 +剥 +剧 +剩 +剪 +副 +割 +剽 +剿 +劈 +力 +劝 +办 +功 +加 +务 +劣 +动 +助 +努 +劫 +励 +劲 +劳 +劵 +势 +勃 +勇 +勉 +勋 +勒 +勘 +募 +勤 +勺 +勾 +勿 +匀 +包 +匆 +匈 +匕 +化 +北 +匙 +匝 +匠 +匡 +匣 +匪 +匮 +匹 +区 +医 +匾 +匿 +十 +千 +升 +午 +卉 +半 +华 +协 +卑 +卒 +卓 +单 +卖 +南 +博 +卜 +卞 +占 +卡 +卢 +卤 +卦 +卧 +卫 +卯 +印 +危 +卲 +即 +却 +卵 +卷 +卸 +卿 +厂 +厄 +厅 +历 +厉 +压 +厌 +厕 +厘 +厚 +原 +厢 +厥 +厦 +厨 +厩 +厮 +去 +县 +参 +又 +叉 +及 +友 +双 +反 +发 +叔 +取 +受 +变 +叙 +叛 +叠 +口 +古 +句 +另 +叨 +叩 +只 +叫 +召 +叭 +叮 +可 +台 +叱 +史 +右 +叵 +叶 +号 +司 +叹 +叼 +吁 +吃 +各 +吆 +合 +吉 +吊 +同 +名 +后 +吏 +吐 +向 +吓 +吕 +吗 +君 +吝 +吞 +吟 +否 +吧 +吨 +吩 +含 +听 +吭 +启 +吴 +吵 +吸 +吹 +吻 +吼 +吾 +吿 +呀 +呃 +呆 +呈 +告 +呐 +呕 +呗 +员 +呛 +呜 +呢 +呦 +周 +呲 +味 +呵 +呼 +命 +咀 +咄 +咋 +和 +咎 +咏 +咐 +咒 +咔 +咕 +咖 +咚 +咣 +咤 +咧 +咨 +咪 +咫 +咬 +咯 +咱 +咳 +咸 +咽 +哀 +品 +哄 +哆 +哇 +哈 +哉 +响 +哎 +哑 +哒 +哗 +哟 +哥 +哦 +哨 +哪 +哭 +哲 +哺 +哼 +哽 +唁 +唇 +唉 +唏 +唐 +唠 +唤 +唬 +售 +唯 +唱 +唾 +啃 +商 +啊 +啕 +啡 +啤 +啥 +啦 +啧 +啪 +啬 +啰 +啵 +啶 +啸 +啼 +喀 +喂 +善 +喆 +喇 +喉 +喊 +喔 +喘 +喜 +喝 +喧 +喱 +喵 +喷 +喻 +喽 +嗅 +嗑 +嗒 +嗓 +嗡 +嗣 +嗤 +嗦 +嗨 +嗬 +嗯 +嗲 +嗷 +嗽 +嘀 +嘉 +嘎 +嘘 +嘛 +嘟 +嘭 +嘱 +嘲 +嘴 +嘻 +噎 +器 +噩 +噪 +噬 +噱 +噼 +嚎 +嚏 +嚓 +嚣 +嚷 +嚼 +囊 +囚 +四 +回 +因 +团 +囤 +囧 +园 +困 +围 +固 +国 +图 +圆 +圈 +土 +圣 +在 +圩 +圪 +圭 +地 +圳 +场 +圾 +址 +坂 +均 +坊 +坍 +坎 +坏 +坐 +坑 +块 +坚 +坛 +坝 +坞 +坟 +坠 +坡 +坤 +坦 +坪 +坯 +坷 +垂 +垃 +垄 +垅 +型 +垌 +垒 +垛 +垢 +垣 +垤 +垦 +垫 +垮 +埃 +埋 +城 +埔 +埜 +域 +培 +基 +堂 +堆 +堕 +堡 +堤 +堪 +堰 +堵 +塌 +塑 +塔 +塘 +塞 +填 +塬 +塾 +境 +墅 +墓 +墙 +增 +墟 +墨 +墩 +壁 +壑 +壕 +壤 +士 +壮 +声 +壳 +壶 +壹 +处 +备 +复 +夏 +夕 +外 +夙 +多 +夜 +够 +大 +天 +太 +夫 +夭 +央 +夯 +失 +头 +夷 +夸 +夹 +夺 +奂 +奇 +奈 +奉 +奋 +奎 +奏 +契 +奔 +奕 +奖 +套 +奘 +奚 +奠 +奢 +奥 +女 +奴 +奶 +奸 +她 +好 +如 +妃 +妄 +妆 +妇 +妈 +妊 +妍 +妒 +妖 +妙 +妞 +妤 +妥 +妧 +妨 +妩 +妮 +妯 +妹 +妻 +姆 +姊 +始 +姐 +姑 +姓 +委 +姗 +姚 +姜 +姝 +姣 +姥 +姨 +姬 +姻 +姿 +威 +娃 +娄 +娅 +娇 +娌 +娘 +娜 +娟 +娠 +娥 +娩 +娱 +娴 +娶 +娼 +婀 +婆 +婉 +婕 +婚 +婧 +婪 +婴 +婵 +婶 +婷 +婿 +媒 +媚 +媛 +媞 +媲 +媳 +嫁 +嫂 +嫉 +嫌 +嫔 +嫖 +嫚 +嫣 +嫦 +嫩 +嬉 +嬛 +嬷 +孀 +子 +孔 +孕 +字 +存 +孙 +孚 +孜 +孝 +孟 +孢 +季 +孤 +学 +孩 +孪 +孰 +孱 +孵 +孺 +宁 +它 +宅 +宇 +守 +安 +宋 +完 +宏 +宓 +宕 +宗 +官 +宙 +定 +宛 +宜 +宝 +实 +宠 +审 +客 +宣 +室 +宦 +宪 +宫 +宰 +害 +宴 +宵 +家 +宸 +容 +宽 +宾 +宿 +寂 +寄 +寅 +密 +寇 +富 +寐 +寒 +寓 +寝 +寞 +察 +寡 +寥 +寨 +寮 +寰 +寸 +对 +寺 +寻 +导 +寿 +封 +射 +将 +尊 +小 +少 +尔 +尖 +尘 +尚 +尝 +尤 +尧 +尬 +就 +尴 +尸 +尹 +尺 +尼 +尽 +尾 +尿 +局 +屁 +层 +居 +屈 +届 +屋 +屌 +屎 +屏 +屑 +展 +属 +屠 +屡 +履 +屯 +山 +屹 +屿 +岁 +岂 +岌 +岐 +岔 +岖 +岗 +岚 +岛 +岩 +岬 +岭 +岱 +岳 +岷 +岸 +峁 +峙 +峡 +峥 +峨 +峪 +峭 +峰 +峻 +崂 +崃 +崇 +崎 +崔 +崖 +崛 +崧 +崩 +崭 +崴 +嵋 +嵌 +嵘 +嵛 +嵩 +嶝 +巅 +巍 +川 +州 +巡 +巢 +工 +左 +巧 +巨 +巩 +巫 +差 +己 +已 +巴 +巷 +巾 +巿 +币 +市 +布 +帅 +帆 +师 +希 +帐 +帕 +帖 +帘 +帚 +帜 +帝 +带 +席 +帮 +帷 +常 +帼 +帽 +幂 +幄 +幅 +幌 +幕 +幢 +干 +平 +年 +并 +幸 +幺 +幻 +幼 +幽 +广 +庄 +庆 +庇 +床 +序 +庐 +库 +应 +底 +店 +庙 +庚 +府 +庞 +废 +度 +座 +庭 +庵 +康 +庸 +庾 +廉 +廊 +廓 +廖 +延 +廷 +建 +开 +异 +弃 +弄 +弈 +弊 +式 +弓 +引 +弗 +弘 +弛 +弟 +张 +弥 +弦 +弧 +弩 +弯 +弱 +弹 +强 +归 +当 +录 +彝 +形 +彤 +彦 +彩 +彪 +彬 +彭 +彰 +影 +彷 +役 +彻 +彼 +彿 +往 +征 +径 +待 +徇 +很 +徉 +徊 +律 +徐 +徒 +得 +徘 +徙 +御 +循 +微 +德 +徽 +心 +必 +忆 +忌 +忍 +忐 +忑 +志 +忘 +忙 +忠 +忧 +忪 +快 +忱 +念 +忽 +怀 +态 +怂 +怎 +怒 +怕 +怖 +怜 +思 +怠 +怡 +急 +怦 +性 +怨 +怪 +怯 +怵 +总 +恋 +恍 +恐 +恒 +恙 +恢 +恣 +恤 +恨 +恩 +恪 +恬 +恭 +息 +恰 +恳 +恶 +恸 +恺 +恼 +恿 +悄 +悉 +悍 +悔 +悖 +悚 +悟 +悠 +患 +悦 +您 +悬 +悯 +悲 +悴 +悸 +悼 +情 +惊 +惋 +惑 +惕 +惚 +惜 +惟 +惠 +惦 +惧 +惨 +惩 +惫 +惬 +惮 +惯 +惰 +想 +惶 +惹 +惺 +愁 +愈 +愉 +意 +愕 +愚 +感 +愤 +愧 +愿 +慈 +慌 +慎 +慑 +慕 +慢 +慧 +慨 +慰 +慷 +憋 +憔 +憧 +憨 +憩 +憬 +憷 +憾 +懂 +懈 +懊 +懋 +懒 +懵 +懿 +戈 +戎 +戏 +成 +我 +戒 +或 +战 +戚 +戛 +戟 +截 +戬 +戮 +戳 +戴 +户 +房 +所 +扁 +扇 +扉 +手 +才 +扎 +扑 +扒 +打 +扔 +托 +扛 +扣 +执 +扩 +扫 +扬 +扭 +扮 +扯 +扰 +扳 +扶 +批 +扼 +找 +承 +技 +抄 +抉 +把 +抑 +抒 +抓 +投 +抖 +抗 +折 +抚 +抛 +抠 +抡 +抢 +护 +报 +抨 +披 +抬 +抱 +抵 +抹 +押 +抽 +抿 +拄 +担 +拆 +拇 +拈 +拉 +拌 +拍 +拎 +拐 +拒 +拓 +拔 +拖 +拗 +拘 +拙 +招 +拜 +拟 +拢 +拣 +拥 +拦 +拧 +拨 +择 +括 +拭 +拮 +拯 +拱 +拳 +拴 +拷 +拼 +拽 +拾 +拿 +持 +挂 +指 +按 +挎 +挑 +挖 +挚 +挛 +挝 +挟 +挠 +挡 +挣 +挤 +挥 +挨 +挪 +挫 +振 +挺 +挽 +捂 +捅 +捆 +捉 +捍 +捎 +捏 +捐 +捕 +捞 +损 +捡 +换 +捣 +捧 +据 +捷 +捺 +捻 +掀 +掂 +授 +掉 +掌 +掏 +掐 +排 +掖 +掘 +掠 +探 +掣 +接 +控 +推 +掩 +措 +掬 +掮 +掰 +掴 +掷 +掺 +揉 +揍 +描 +提 +插 +握 +揣 +揩 +揪 +揭 +援 +揽 +搀 +搁 +搂 +搅 +搏 +搜 +搞 +搡 +搪 +搬 +搭 +携 +搽 +摁 +摄 +摆 +摇 +摊 +摒 +摔 +摘 +摧 +摩 +摸 +摹 +撂 +撇 +撑 +撒 +撕 +撞 +撤 +撩 +撬 +播 +撮 +撰 +撵 +撸 +撼 +擂 +擅 +操 +擎 +擒 +擘 +擞 +擦 +攀 +攒 +攥 +支 +收 +改 +攻 +放 +政 +故 +效 +敌 +敏 +救 +敖 +教 +敛 +敝 +敞 +敢 +散 +敦 +敬 +数 +敲 +整 +敷 +文 +斌 +斐 +斑 +斓 +斗 +料 +斛 +斜 +斟 +斤 +斥 +斧 +斩 +断 +斯 +新 +方 +施 +旁 +旅 +旋 +族 +旗 +无 +既 +日 +旦 +旧 +旨 +早 +旬 +旭 +旱 +时 +旷 +旺 +昀 +昂 +昆 +昊 +昌 +明 +昏 +易 +昔 +昕 +昙 +星 +映 +春 +昧 +昨 +昭 +是 +昱 +昵 +昼 +显 +晃 +晋 +晏 +晒 +晓 +晔 +晕 +晖 +晗 +晚 +晟 +晤 +晦 +晨 +普 +景 +晰 +晴 +晶 +智 +晾 +暂 +暄 +暇 +暑 +暖 +暗 +暧 +暨 +暮 +暴 +曙 +曝 +曦 +曰 +曲 +更 +曹 +曼 +曾 +替 +最 +月 +有 +朋 +服 +朐 +朔 +朗 +望 +朝 +期 +朦 +木 +未 +末 +本 +札 +术 +朱 +朴 +朵 +机 +朽 +杀 +杂 +权 +杆 +杉 +李 +杏 +材 +村 +杖 +杜 +杞 +束 +杠 +条 +来 +杨 +杭 +杯 +杰 +杳 +松 +板 +极 +构 +枉 +析 +枕 +林 +枚 +果 +枝 +枞 +枢 +枣 +枪 +枫 +枭 +枯 +架 +枷 +柄 +柏 +某 +染 +柔 +柜 +柞 +柠 +查 +柬 +柯 +柱 +柳 +柴 +柿 +栅 +标 +栈 +栋 +栏 +树 +栓 +栖 +栗 +校 +株 +样 +核 +根 +格 +栽 +栾 +桂 +桃 +框 +案 +桉 +桌 +桎 +桐 +桑 +桓 +桔 +档 +桥 +桦 +桩 +桶 +梁 +梅 +梓 +梗 +梦 +梧 +梨 +梭 +梯 +械 +梳 +梵 +检 +棉 +棋 +棍 +棒 +棕 +棘 +棚 +棠 +森 +棱 +棵 +棺 +椅 +椋 +植 +椎 +椒 +椰 +椿 +楂 +楔 +楚 +楞 +楠 +楣 +楷 +楼 +概 +榄 +榆 +榈 +榉 +榔 +榕 +榜 +榨 +榭 +榴 +榷 +榻 +槌 +槎 +槐 +槛 +槟 +槽 +槿 +樊 +樟 +模 +横 +樱 +橄 +橘 +橙 +橡 +橱 +檀 +檐 +檬 +欠 +次 +欢 +欣 +欧 +欲 +欺 +款 +歆 +歇 +歉 +歌 +止 +正 +此 +步 +武 +歧 +歪 +歹 +死 +殃 +殆 +殉 +殊 +残 +殒 +殓 +殖 +殚 +殡 +殭 +殴 +段 +殷 +殿 +毁 +毂 +毅 +毋 +母 +每 +毒 +毓 +比 +毕 +毗 +毙 +毛 +毫 +毯 +毽 +氏 +民 +氓 +气 +氛 +氟 +氢 +氦 +氧 +氨 +氪 +氮 +氯 +氰 +水 +永 +汀 +汁 +求 +汇 +汉 +汕 +汗 +汛 +汝 +汞 +江 +池 +污 +汤 +汪 +汰 +汲 +汴 +汶 +汹 +汽 +汾 +沁 +沃 +沅 +沈 +沉 +沏 +沐 +沓 +沙 +沛 +沟 +没 +沣 +沥 +沦 +沧 +沪 +沫 +沮 +沱 +河 +沸 +油 +治 +沼 +沽 +沾 +沿 +泄 +泉 +泊 +泌 +泓 +泔 +法 +泗 +泛 +泞 +泠 +泡 +波 +泣 +泥 +注 +泪 +泯 +泰 +泱 +泳 +泵 +泷 +泸 +泻 +泼 +泽 +泾 +洁 +洋 +洒 +洗 +洙 +洛 +洞 +津 +洪 +洱 +洲 +洵 +活 +洼 +洽 +派 +流 +浅 +浆 +浇 +浈 +浊 +测 +济 +浏 +浑 +浓 +浙 +浚 +浦 +浩 +浪 +浮 +浴 +海 +浸 +涂 +涅 +消 +涉 +涌 +涎 +涓 +涕 +涛 +涝 +涞 +涠 +涡 +涤 +润 +涧 +涨 +涩 +涮 +涯 +液 +涵 +涿 +淀 +淄 +淆 +淇 +淋 +淌 +淑 +淖 +淘 +淝 +淞 +淡 +淤 +淫 +淮 +深 +淳 +混 +淹 +添 +淼 +渀 +清 +渊 +渍 +渎 +渐 +渔 +渗 +渚 +渝 +渠 +渡 +渣 +渤 +渥 +温 +渭 +港 +渲 +渴 +游 +渺 +湃 +湍 +湖 +湘 +湛 +湾 +湿 +溃 +溅 +溉 +源 +溜 +溢 +溥 +溧 +溪 +溯 +溶 +溺 +滁 +滇 +滋 +滑 +滔 +滕 +滚 +滞 +满 +滢 +滤 +滥 +滨 +滩 +滴 +漂 +漆 +漏 +漓 +演 +漕 +漠 +漩 +漫 +漭 +漯 +漱 +漳 +漾 +潇 +潘 +潜 +潞 +潢 +潭 +潮 +潼 +澄 +澈 +澎 +澜 +澡 +澳 +激 +濑 +濒 +濠 +濡 +濮 +瀑 +瀚 +瀛 +灌 +灞 +火 +灭 +灯 +灰 +灵 +灶 +灼 +灾 +灿 +炅 +炉 +炊 +炎 +炒 +炕 +炖 +炙 +炜 +炫 +炬 +炭 +炮 +炯 +炳 +炷 +炸 +点 +炼 +炽 +烁 +烂 +烃 +烈 +烊 +烘 +烙 +烟 +烤 +烦 +烧 +烨 +烫 +热 +烯 +烷 +烹 +烽 +焉 +焊 +焕 +焖 +焘 +焚 +焦 +焯 +焰 +焱 +然 +煊 +煌 +煎 +煜 +煞 +煤 +煦 +照 +煮 +煲 +熄 +熊 +熏 +熔 +熙 +熟 +熠 +熨 +熬 +熹 +燃 +燊 +燎 +燕 +燥 +爆 +爪 +爬 +爱 +爵 +父 +爷 +爸 +爹 +爽 +片 +版 +牌 +牙 +牛 +牟 +牡 +牢 +牧 +物 +牲 +牵 +特 +牺 +牾 +犀 +犊 +犒 +犬 +犯 +状 +犷 +犹 +狂 +狄 +狈 +狐 +狗 +狙 +狞 +狠 +狡 +狩 +独 +狭 +狮 +狰 +狱 +狸 +狼 +猎 +猖 +猛 +猜 +猝 +猥 +猩 +猪 +猫 +猬 +献 +猴 +猾 +猿 +獒 +獗 +獾 +玄 +率 +玉 +王 +玖 +玛 +玟 +玥 +玩 +玫 +玮 +环 +现 +玲 +玳 +玺 +玻 +珀 +珉 +珊 +珍 +珏 +珑 +珜 +珠 +班 +珮 +珲 +珺 +球 +琅 +理 +琉 +琊 +琏 +琐 +琛 +琢 +琥 +琦 +琪 +琬 +琰 +琳 +琴 +琵 +琶 +琼 +瑁 +瑄 +瑕 +瑙 +瑚 +瑛 +瑜 +瑞 +瑟 +瑰 +瑶 +瑾 +璀 +璃 +璇 +璋 +璐 +璞 +璧 +璨 +瓜 +瓢 +瓣 +瓦 +瓮 +瓯 +瓶 +瓷 +甄 +甘 +甚 +甜 +生 +甥 +用 +甩 +甫 +甬 +田 +由 +甲 +申 +电 +男 +甸 +町 +画 +畅 +畊 +界 +畏 +畔 +留 +畜 +略 +番 +畴 +畸 +畿 +疃 +疆 +疏 +疑 +疗 +疚 +疝 +疤 +疫 +疯 +疲 +疵 +疹 +疼 +疾 +病 +症 +痉 +痊 +痒 +痕 +痘 +痛 +痣 +痪 +痫 +痰 +痱 +痴 +痹 +痼 +瘀 +瘁 +瘟 +瘠 +瘤 +瘦 +瘩 +瘪 +瘫 +瘸 +瘾 +癌 +癖 +癣 +癫 +登 +白 +百 +皂 +的 +皆 +皇 +皋 +皎 +皓 +皖 +皙 +皮 +皱 +盆 +盈 +益 +盎 +盐 +监 +盒 +盔 +盖 +盗 +盘 +盛 +盟 +目 +盯 +盲 +直 +相 +盹 +盼 +盾 +省 +眈 +眉 +看 +真 +眠 +眨 +眬 +眯 +眶 +眷 +眺 +眼 +着 +睁 +睐 +睛 +睡 +督 +睦 +睫 +睬 +睹 +睿 +瞄 +瞅 +瞌 +瞎 +瞒 +瞟 +瞧 +瞩 +瞪 +瞬 +瞰 +瞳 +瞻 +瞿 +矗 +矛 +矜 +矢 +矣 +知 +矩 +矫 +短 +矮 +石 +矶 +矿 +码 +砂 +砌 +砍 +砒 +研 +砖 +砚 +砝 +砥 +砰 +砲 +破 +砷 +砸 +砺 +砾 +础 +硅 +硕 +硚 +硝 +硫 +硬 +确 +碉 +碌 +碍 +碎 +碑 +碗 +碘 +碚 +碟 +碧 +碰 +碱 +碳 +碴 +碾 +磁 +磅 +磊 +磋 +磐 +磕 +磡 +磨 +磴 +磷 +磺 +礁 +示 +礼 +社 +祁 +祈 +祉 +祖 +祛 +祝 +神 +祠 +祢 +祥 +票 +祭 +祯 +祷 +祸 +祺 +禀 +禁 +禄 +禅 +福 +禧 +禹 +禺 +离 +禽 +禾 +秀 +私 +秃 +秆 +秉 +秋 +种 +科 +秒 +秘 +租 +秣 +秤 +秦 +秧 +秩 +积 +称 +秸 +移 +秽 +稀 +程 +稍 +税 +稚 +稠 +稣 +稳 +稻 +稼 +稽 +稿 +穆 +穗 +穴 +究 +穷 +空 +穿 +突 +窃 +窄 +窈 +窍 +窑 +窒 +窕 +窖 +窗 +窘 +窜 +窝 +窟 +窥 +窦 +窨 +窿 +立 +竖 +站 +竞 +竟 +章 +竣 +童 +竭 +端 +竲 +竹 +竺 +竽 +竿 +笃 +笈 +笋 +笑 +笔 +笙 +笛 +符 +笨 +第 +笼 +等 +筋 +筐 +筑 +筒 +答 +策 +筛 +筱 +筵 +筷 +筹 +签 +简 +箍 +算 +管 +箫 +箭 +箱 +篇 +篡 +篪 +篮 +篷 +簇 +簧 +簸 +簿 +籁 +籍 +米 +类 +籽 +粉 +粒 +粕 +粗 +粘 +粟 +粤 +粥 +粪 +粮 +粱 +粹 +精 +糊 +糕 +糖 +糗 +糙 +糟 +糯 +系 +紊 +素 +索 +紧 +紫 +累 +絮 +綦 +繁 +纠 +红 +纣 +纤 +约 +级 +纪 +纬 +纯 +纰 +纱 +纲 +纳 +纵 +纶 +纷 +纸 +纹 +纺 +纽 +线 +练 +组 +绅 +细 +织 +终 +绊 +绌 +绍 +绎 +经 +绑 +绒 +结 +绕 +绘 +给 +绚 +络 +绝 +绞 +统 +绣 +继 +绩 +绪 +续 +绮 +绯 +绰 +绳 +维 +绵 +绷 +绸 +综 +绽 +绿 +缀 +缄 +缅 +缆 +缇 +缉 +缓 +缔 +缕 +编 +缘 +缙 +缚 +缜 +缝 +缠 +缤 +缨 +缩 +缪 +缭 +缮 +缰 +缴 +缸 +缺 +罂 +罄 +罐 +网 +罕 +罗 +罚 +罡 +罢 +罩 +罪 +置 +署 +罹 +羁 +羊 +美 +羚 +羞 +羡 +羣 +群 +羲 +羹 +羽 +羿 +翁 +翅 +翌 +翔 +翘 +翟 +翠 +翡 +翩 +翰 +翱 +翻 +翼 +耀 +老 +考 +耄 +者 +耋 +而 +耍 +耐 +耒 +耕 +耗 +耘 +耳 +耶 +耷 +耸 +耻 +耽 +耿 +聂 +聆 +聊 +聋 +职 +联 +聘 +聚 +聪 +肃 +肆 +肇 +肉 +肋 +肌 +肖 +肘 +肚 +肛 +肝 +肠 +股 +肢 +肤 +肥 +肩 +肪 +肮 +肯 +育 +肴 +肺 +肾 +肿 +胀 +胁 +胃 +胆 +背 +胎 +胖 +胚 +胛 +胜 +胞 +胡 +胤 +胧 +胫 +胯 +胰 +胱 +胳 +胶 +胸 +胺 +能 +脂 +脆 +脉 +脊 +脍 +脏 +脐 +脑 +脖 +脚 +脯 +脱 +脸 +脾 +腆 +腊 +腋 +腌 +腐 +腑 +腓 +腔 +腕 +腥 +腩 +腰 +腱 +腹 +腺 +腻 +腼 +腾 +腿 +膀 +膊 +膏 +膑 +膛 +膜 +膝 +膨 +膳 +膺 +臀 +臂 +臃 +臆 +臣 +自 +臭 +至 +致 +臻 +舀 +舅 +舆 +舌 +舍 +舒 +舛 +舜 +舞 +舟 +航 +般 +舰 +舱 +舵 +舶 +舸 +船 +艇 +艋 +艘 +良 +艰 +色 +艳 +艺 +艾 +节 +芊 +芋 +芒 +芙 +芜 +芝 +芦 +芬 +芭 +芮 +芯 +花 +芳 +芷 +芸 +芽 +苇 +苍 +苏 +苑 +苗 +苛 +苟 +苡 +苣 +若 +苦 +苯 +英 +苹 +茁 +茂 +范 +茄 +茅 +茆 +茎 +茗 +茜 +茨 +茫 +茵 +茶 +茸 +茹 +荃 +荆 +草 +荐 +荒 +荔 +荚 +荞 +荟 +荡 +荣 +荤 +荧 +荫 +药 +荷 +荼 +莅 +莆 +莉 +莎 +莓 +莘 +莞 +莠 +莫 +莱 +莲 +莴 +获 +莹 +莺 +莽 +菁 +菇 +菊 +菌 +菜 +菠 +菡 +菩 +菱 +菲 +萃 +萄 +萋 +萌 +萍 +萎 +萝 +萤 +营 +萦 +萧 +萨 +萱 +落 +葆 +著 +葛 +葡 +董 +葩 +葫 +葬 +葱 +葵 +蒂 +蒋 +蒙 +蒜 +蒲 +蒸 +蒿 +蓁 +蓄 +蓉 +蓝 +蓟 +蓬 +蔑 +蔓 +蔗 +蔚 +蔡 +蔫 +蔬 +蔷 +蔺 +蔽 +蕉 +蕊 +蕙 +蕲 +蕴 +蕾 +薄 +薇 +薛 +薪 +薯 +薰 +藏 +藜 +藤 +藩 +藻 +蘑 +虎 +虐 +虑 +虚 +虞 +虫 +虱 +虹 +虽 +虾 +蚀 +蚁 +蚂 +蚊 +蚌 +蚓 +蚕 +蚝 +蚣 +蚯 +蛀 +蛇 +蛋 +蛐 +蛙 +蛛 +蛟 +蛮 +蛰 +蜀 +蜂 +蜇 +蜈 +蜊 +蜒 +蜓 +蜕 +蜘 +蜚 +蜜 +蜡 +蜥 +蜴 +蜷 +蜿 +蝇 +蝉 +蝎 +蝗 +蝙 +蝠 +蝴 +蝶 +螂 +螃 +融 +螳 +螺 +蟑 +蟹 +蠢 +血 +衅 +行 +衍 +衔 +街 +衙 +衡 +衣 +补 +表 +衫 +衬 +衰 +衷 +袁 +袂 +袄 +袆 +袈 +袋 +袍 +袒 +袖 +袜 +被 +袭 +袱 +裁 +裂 +装 +裆 +裔 +裕 +裙 +裟 +裤 +裳 +裴 +裸 +裹 +褂 +褒 +褓 +褚 +褛 +褪 +褴 +褶 +襁 +襄 +襟 +西 +要 +覃 +覆 +见 +观 +规 +觅 +视 +览 +觉 +觊 +觎 +觐 +觑 +角 +解 +觥 +触 +言 +詹 +誉 +誓 +警 +譬 +计 +订 +认 +讧 +讨 +让 +讪 +训 +议 +讯 +记 +讲 +讳 +讶 +许 +讹 +论 +讼 +讽 +设 +访 +诀 +证 +评 +诅 +识 +诈 +诉 +诊 +词 +译 +诓 +试 +诗 +诙 +诚 +话 +诞 +诟 +诠 +诡 +询 +该 +详 +诧 +诩 +诫 +诬 +语 +误 +诱 +诲 +说 +诵 +诶 +请 +诸 +诺 +读 +诽 +课 +诿 +谀 +谁 +调 +谅 +谈 +谊 +谋 +谌 +谍 +谎 +谐 +谑 +谓 +谕 +谙 +谚 +谜 +谢 +谣 +谤 +谦 +谨 +谩 +谬 +谭 +谱 +谴 +谷 +豁 +豆 +豚 +象 +豪 +豫 +豹 +貅 +貉 +貌 +貔 +贝 +贞 +负 +贡 +财 +责 +贤 +败 +账 +货 +质 +贩 +贪 +贫 +贬 +购 +贮 +贯 +贱 +贴 +贵 +贷 +贸 +费 +贺 +贼 +贾 +贿 +赁 +赂 +赃 +资 +赋 +赌 +赎 +赏 +赐 +赔 +赖 +赘 +赚 +赛 +赝 +赞 +赠 +赡 +赢 +赣 +赤 +赦 +赫 +走 +赴 +赵 +赶 +起 +趁 +超 +越 +趋 +趟 +趣 +足 +趴 +趸 +趾 +跃 +跄 +跆 +跌 +跑 +跛 +距 +跟 +跤 +跨 +跪 +路 +跳 +践 +跷 +跺 +跻 +踉 +踊 +踏 +踝 +踞 +踢 +踩 +踪 +踵 +踹 +蹂 +蹄 +蹈 +蹊 +蹚 +蹦 +蹬 +蹭 +蹲 +蹴 +蹶 +蹼 +蹿 +躁 +躏 +身 +躬 +躯 +躲 +躺 +车 +轧 +轨 +轩 +转 +轮 +软 +轰 +轴 +轶 +轻 +载 +轿 +较 +辄 +辅 +辆 +辈 +辉 +辍 +辐 +辑 +输 +辖 +辗 +辘 +辙 +辛 +辜 +辞 +辟 +辣 +辨 +辩 +辫 +辰 +辱 +边 +辽 +达 +迁 +迂 +迄 +迅 +过 +迈 +迎 +运 +近 +返 +还 +这 +进 +远 +违 +连 +迟 +迢 +迥 +迪 +迫 +迭 +述 +迷 +迸 +迹 +追 +退 +送 +适 +逃 +逅 +逆 +选 +逊 +逍 +透 +逐 +递 +途 +逗 +通 +逛 +逝 +逞 +速 +造 +逡 +逢 +逮 +逵 +逸 +逻 +逼 +逾 +遁 +遂 +遇 +遍 +遏 +遐 +道 +遗 +遛 +遢 +遣 +遥 +遨 +遭 +遮 +遴 +遵 +避 +邀 +邂 +邃 +邋 +邑 +邓 +邛 +邝 +邢 +那 +邦 +邪 +邬 +邮 +邯 +邱 +邵 +邹 +邺 +邻 +郁 +郊 +郎 +郑 +郜 +郝 +郡 +部 +郫 +郭 +郸 +都 +鄂 +鄙 +鄞 +鄢 +酋 +酌 +配 +酒 +酗 +酝 +酣 +酪 +酬 +酯 +酱 +酵 +酶 +酷 +酸 +酿 +醇 +醉 +醋 +醍 +醐 +醒 +醛 +采 +釉 +释 +里 +重 +野 +量 +金 +釜 +鉴 +鏖 +鑫 +针 +钉 +钊 +钓 +钛 +钝 +钞 +钟 +钠 +钢 +钥 +钦 +钧 +钩 +钮 +钰 +钱 +钵 +钻 +钾 +铀 +铁 +铂 +铃 +铅 +铆 +铉 +铎 +铐 +铜 +铝 +铠 +铣 +铨 +铬 +铭 +铮 +铰 +铲 +银 +铸 +铺 +链 +铿 +销 +锁 +锂 +锄 +锅 +锆 +锈 +锋 +锌 +锏 +锐 +错 +锜 +锟 +锡 +锢 +锣 +锤 +锥 +锦 +锭 +键 +锯 +锰 +锵 +锷 +锹 +锻 +镀 +镁 +镇 +镉 +镊 +镍 +镑 +镖 +镜 +镯 +镳 +镶 +长 +门 +闪 +闫 +闭 +问 +闯 +闰 +闲 +闳 +间 +闵 +闷 +闸 +闹 +闺 +闻 +闽 +阀 +阁 +阂 +阅 +阎 +阐 +阔 +阙 +阚 +阜 +队 +阮 +阱 +防 +阳 +阴 +阵 +阶 +阻 +阿 +陀 +陂 +附 +际 +陆 +陈 +陋 +陌 +降 +限 +陕 +陡 +院 +除 +陨 +险 +陪 +陬 +陵 +陶 +陷 +隅 +隆 +隋 +隍 +随 +隐 +隔 +隘 +隙 +障 +隧 +隶 +隼 +隽 +难 +雀 +雁 +雄 +雅 +集 +雇 +雌 +雍 +雏 +雕 +雨 +雪 +雯 +雳 +零 +雷 +雾 +需 +霁 +霄 +霆 +震 +霈 +霉 +霍 +霎 +霏 +霖 +霜 +霞 +露 +霸 +霹 +霾 +靑 +青 +靓 +靖 +静 +靛 +非 +靠 +靡 +面 +革 +靳 +靴 +靶 +鞋 +鞍 +鞘 +鞠 +鞭 +韦 +韧 +韩 +韬 +音 +韵 +韶 +页 +顶 +顷 +项 +顺 +须 +顽 +顾 +顿 +颁 +颂 +预 +颅 +领 +颇 +颈 +颊 +颍 +颐 +频 +颓 +颖 +颗 +题 +颚 +颜 +额 +颠 +颤 +风 +飒 +飓 +飘 +飙 +飚 +飞 +食 +餐 +餮 +饕 +饥 +饪 +饭 +饮 +饰 +饱 +饲 +饵 +饶 +饺 +饼 +饽 +饿 +馀 +馅 +馆 +馈 +馊 +馋 +馑 +馒 +首 +馗 +香 +馥 +馨 +马 +驭 +驯 +驰 +驱 +驳 +驴 +驶 +驻 +驼 +驾 +驿 +骁 +骂 +骄 +骅 +骆 +骇 +骊 +骋 +验 +骏 +骐 +骑 +骗 +骚 +骜 +骤 +骥 +骨 +骷 +骸 +骼 +髅 +髋 +髓 +高 +髦 +鬼 +魁 +魂 +魄 +魅 +魇 +魏 +魔 +鱼 +鲁 +鲍 +鲜 +鲟 +鲨 +鲶 +鲷 +鲸 +鳄 +鳅 +鳌 +鳖 +鳝 +鳞 +鸟 +鸠 +鸡 +鸣 +鸥 +鸦 +鸭 +鸯 +鸳 +鸵 +鸽 +鸾 +鸿 +鹃 +鹅 +鹊 +鹏 +鹜 +鹞 +鹤 +鹭 +鹰 +鹿 +麋 +麒 +麓 +麟 +麦 +麻 +麾 +黄 +黍 +黎 +黏 +黑 +黔 +默 +黛 +黝 +黯 +鼎 +鼓 +鼠 +鼻 +鼾 +齐 +齿 +龄 +龙 +龚 +龟 + diff --git a/modules/audio/asr/u2_conformer_aishell/module.py b/modules/audio/asr/u2_conformer_aishell/module.py new file mode 100644 index 00000000..8ce72804 --- /dev/null +++ b/modules/audio/asr/u2_conformer_aishell/module.py @@ -0,0 +1,73 @@ +# Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved. +# +# 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. + +import os +from pathlib import Path +import sys + +import numpy as np +from paddlehub.env import MODULE_HOME +from paddlehub.module.module import moduleinfo, serving +from paddlehub.utils.log import logger + +import paddle +import soundfile as sf + +# TODO: Remove system path when deepspeech can be installed via pip. +sys.path.append(os.path.join(MODULE_HOME, 'u2_conformer_aishell')) +from deepspeech.exps.u2.config import get_cfg_defaults +from deepspeech.utils.utility import UpdateConfig +from .u2_conformer_tester import U2ConformerTester + + +@moduleinfo(name="u2_conformer_aishell", version="1.0.0", summary="", author="Baidu", author_email="", type="audio/asr") +class U2Conformer(paddle.nn.Layer): + def __init__(self): + super(U2Conformer, self).__init__() + + # resource + res_dir = os.path.join(MODULE_HOME, 'u2_conformer_aishell', 'assets') + conf_file = os.path.join(res_dir, 'conf/conformer.yaml') + checkpoint = os.path.join(res_dir, 'checkpoints/avg_20.pdparams') + + # config + self.config = get_cfg_defaults() + self.config.merge_from_file(conf_file) + + # TODO: Remove path updating snippet. + with UpdateConfig(self.config): + self.config.collator.vocab_filepath = os.path.join(res_dir, self.config.collator.vocab_filepath) + # self.config.collator.spm_model_prefix = os.path.join(res_dir, self.config.collator.spm_model_prefix) + self.config.collator.augmentation_config = os.path.join(res_dir, self.config.collator.augmentation_config) + self.config.model.cmvn_file = os.path.join(res_dir, self.config.model.cmvn_file) + self.config.decoding.decoding_method = 'attention_rescoring' + self.config.decoding.batch_size = 1 + + # model + self.tester = U2ConformerTester(self.config) + self.tester.setup_model() + self.tester.resume(checkpoint) + + @staticmethod + def check_audio(audio_file): + sig, sample_rate = sf.read(audio_file) + assert sample_rate == 16000, 'Excepting sample rate of input audio is 16000, but got {}'.format(sample_rate) + + @serving + def speech_recognize(self, audio_file, device='cpu'): + assert os.path.isfile(audio_file), 'File not exists: {}'.format(audio_file) + self.check_audio(audio_file) + + paddle.set_device(device) + return self.tester.test(audio_file)[0][0] diff --git a/modules/audio/asr/u2_conformer_aishell/requirements.txt b/modules/audio/asr/u2_conformer_aishell/requirements.txt new file mode 100644 index 00000000..49fb307f --- /dev/null +++ b/modules/audio/asr/u2_conformer_aishell/requirements.txt @@ -0,0 +1,12 @@ +loguru +yacs +jsonlines +scipy==1.2.1 +sentencepiece +resampy==0.2.2 +SoundFile==0.9.0.post1 +soxbindings +kaldiio +typeguard +editdistance +textgrid diff --git a/modules/audio/asr/u2_conformer_aishell/u2_conformer_tester.py b/modules/audio/asr/u2_conformer_aishell/u2_conformer_tester.py new file mode 100644 index 00000000..c4f8d470 --- /dev/null +++ b/modules/audio/asr/u2_conformer_aishell/u2_conformer_tester.py @@ -0,0 +1,80 @@ +# Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved. +# +# 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. +"""Evaluation for U2 model.""" +import os +import sys + +import paddle + +from deepspeech.frontend.featurizer.text_featurizer import TextFeaturizer +from deepspeech.io.collator import SpeechCollator +from deepspeech.models.u2 import U2Model +from deepspeech.utils import mp_tools +from deepspeech.utils.utility import UpdateConfig + + +class U2ConformerTester: + def __init__(self, config): + self.config = config + self.collate_fn_test = SpeechCollator.from_config(config) + self._text_featurizer = TextFeaturizer( + unit_type=config.collator.unit_type, vocab_filepath=None, spm_model_prefix=config.collator.spm_model_prefix) + + @mp_tools.rank_zero_only + @paddle.no_grad() + def test(self, audio_file): + self.model.eval() + cfg = self.config.decoding + collate_fn_test = self.collate_fn_test + audio, _ = collate_fn_test.process_utterance(audio_file=audio_file, transcript="Hello") + audio_len = audio.shape[0] + audio = paddle.to_tensor(audio, dtype='float32') + audio_len = paddle.to_tensor(audio_len) + audio = paddle.unsqueeze(audio, axis=0) + vocab_list = collate_fn_test.vocab_list + + text_feature = self.collate_fn_test.text_feature + result_transcripts = self.model.decode( + audio, + audio_len, + text_feature=text_feature, + decoding_method=cfg.decoding_method, + lang_model_path=cfg.lang_model_path, + beam_alpha=cfg.alpha, + beam_beta=cfg.beta, + beam_size=cfg.beam_size, + cutoff_prob=cfg.cutoff_prob, + cutoff_top_n=cfg.cutoff_top_n, + num_processes=cfg.num_proc_bsearch, + ctc_weight=cfg.ctc_weight, + decoding_chunk_size=cfg.decoding_chunk_size, + num_decoding_left_chunks=cfg.num_decoding_left_chunks, + simulate_streaming=cfg.simulate_streaming) + + return result_transcripts + + def setup_model(self): + config = self.config.clone() + with UpdateConfig(config): + config.model.input_dim = self.collate_fn_test.feature_size + config.model.output_dim = self.collate_fn_test.vocab_size + + self.model = U2Model.from_config(config.model) + + def resume(self, checkpoint): + """Resume from the checkpoint at checkpoints in the output + directory or load a specified checkpoint. + """ + model_dict = paddle.load(checkpoint) + self.model.set_state_dict(model_dict) diff --git a/modules/audio/asr/u2_conformer_librispeech/README.md b/modules/audio/asr/u2_conformer_librispeech/README.md new file mode 100644 index 00000000..f16da3f5 --- /dev/null +++ b/modules/audio/asr/u2_conformer_librispeech/README.md @@ -0,0 +1,156 @@ +# u2_conformer_librispeech + +|模型名称|u2_conformer_librispeech| +| :--- | :---: | +|类别|语音-语音识别| +|网络|DeepSpeech2| +|数据集|LibriSpeech| +|是否支持Fine-tuning|否| +|模型大小|191MB| +|最新更新日期|2021-11-01| +|数据指标|英文WER 0.034| + +## 一、模型基本信息 + +### 模型介绍 + +U2 Conformer模型是一种适用于英文和中文的end-to-end语音识别模型。u2_conformer_libirspeech采用了conformer的encoder和transformer的decoder的模型结构,并且使用了ctc-prefix beam search的方式进行一遍打分,再利用attention decoder进行二次打分的方式进行解码来得到最终结果。 + +u2_conformer_libirspeech在英文开源语音数据集[LibriSpeech ASR corpus](http://www.openslr.org/12/)进行了预训练,该模型在其测试集上的WER指标是0.034655。 + +

+
+

+ +

+
+

+ +更多详情请参考: +- [Unified Streaming and Non-streaming Two-pass End-to-end Model for Speech Recognition](https://arxiv.org/abs/2012.05481) +- [Conformer: Convolution-augmented Transformer for Speech Recognition](https://arxiv.org/abs/2005.08100) + +## 二、安装 + +- ### 1、系统依赖 + + - libsndfile + - Linux + ```shell + $ sudo apt-get install libsndfile + or + $ sudo yum install libsndfile + ``` + - MacOs + ``` + $ brew install libsndfile + ``` + +- ### 2、环境依赖 + + - paddlepaddle >= 2.1.0 + + - paddlehub >= 2.1.0 | [如何安装PaddleHub](../../../../docs/docs_ch/get_start/installation.rst) + +- ### 3、安装 + + - ```shell + $ hub install u2_conformer_librispeech + ``` + - 如您安装时遇到问题,可参考:[零基础windows安装](../../../../docs/docs_ch/get_start/windows_quickstart.md) + | [零基础Linux安装](../../../../docs/docs_ch/get_start/linux_quickstart.md) | [零基础MacOS安装](../../../../docs/docs_ch/get_start/mac_quickstart.md) + + +## 三、模型API预测 + +- ### 1、预测代码示例 + + - ```python + import paddlehub as hub + + # 采样率为16k,格式为wav的英文语音音频 + wav_file = '/PATH/TO/AUDIO' + + model = hub.Module( + name='u2_conformer_librispeech', + version='1.0.0') + text = model.speech_recognize(wav_file) + + print(text) + ``` + +- ### 2、API + - ```python + def check_audio(audio_file) + ``` + - 检查输入音频格式和采样率是否满足为16000 + + - **参数** + + - `audio_file`:本地音频文件(*.wav)的路径,如`/path/to/input.wav` + + - ```python + def speech_recognize( + audio_file, + device='cpu', + ) + ``` + - 将输入的音频识别成文字 + + - **参数** + + - `audio_file`:本地音频文件(*.wav)的路径,如`/path/to/input.wav` + - `device`:预测时使用的设备,默认为`cpu`,如需使用gpu预测,请设置为`gpu`。 + + - **返回** + + - `text`:str类型,返回输入音频的识别文字结果。 + + +## 四、服务部署 + +- PaddleHub Serving可以部署一个在线的语音识别服务。 + +- ### 第一步:启动PaddleHub Serving + + - ```shell + $ hub serving start -m u2_conformer_librispeech + ``` + + - 这样就完成了一个语音识别服务化API的部署,默认端口号为8866。 + + - **NOTE:** 如使用GPU预测,则需要在启动服务之前,请设置CUDA_VISIBLE_DEVICES环境变量,否则不用设置。 + +- ### 第二步:发送预测请求 + + - 配置好服务端,以下数行代码即可实现发送预测请求,获取预测结果 + + - ```python + import requests + import json + + # 需要识别的音频的存放路径,确保部署服务的机器可访问 + file = '/path/to/input.wav' + + # 以key的方式指定text传入预测方法的时的参数,此例中为"audio_file" + data = {"audio_file": file} + + # 发送post请求,content-type类型应指定json方式,url中的ip地址需改为对应机器的ip + url = "http://127.0.0.1:8866/predict/u2_conformer_librispeech" + + # 指定post请求的headers为application/json方式 + headers = {"Content-Type": "application/json"} + + r = requests.post(url=url, headers=headers, data=json.dumps(data)) + print(r.json()) + ``` + +## 五、更新历史 + +* 1.0.0 + + 初始发布 + + ```shell + $ hub install u2_conformer_librispeech + ``` diff --git a/modules/audio/asr/u2_conformer_librispeech/__init__.py b/modules/audio/asr/u2_conformer_librispeech/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/modules/audio/asr/u2_conformer_librispeech/assets/conf/augmentation.json b/modules/audio/asr/u2_conformer_librispeech/assets/conf/augmentation.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/modules/audio/asr/u2_conformer_librispeech/assets/conf/augmentation.json @@ -0,0 +1 @@ +{} diff --git a/modules/audio/asr/u2_conformer_librispeech/assets/conf/conformer.yaml b/modules/audio/asr/u2_conformer_librispeech/assets/conf/conformer.yaml new file mode 100644 index 00000000..72342e44 --- /dev/null +++ b/modules/audio/asr/u2_conformer_librispeech/assets/conf/conformer.yaml @@ -0,0 +1,116 @@ +# https://yaml.org/type/float.html +data: + train_manifest: data/manifest.test-clean + dev_manifest: data/manifest.test-clean + test_manifest: data/manifest.test-clean + min_input_len: 0.5 # seconds + max_input_len: 30.0 # seconds + min_output_len: 0.0 # tokens + max_output_len: 400.0 # tokens + min_output_input_ratio: 0.05 + max_output_input_ratio: 100.0 + +collator: + vocab_filepath: data/vocab.txt + unit_type: 'spm' + spm_model_prefix: 'data/bpe_unigram_5000' + mean_std_filepath: "" + augmentation_config: conf/augmentation.json + batch_size: 16 + raw_wav: True # use raw_wav or kaldi feature + spectrum_type: fbank #linear, mfcc, fbank + feat_dim: 80 + delta_delta: False + dither: 1.0 + target_sample_rate: 16000 + max_freq: None + n_fft: None + stride_ms: 10.0 + window_ms: 25.0 + use_dB_normalization: True + target_dB: -20 + random_seed: 0 + keep_transcription_text: False + sortagrad: True + shuffle_method: batch_shuffle + num_workers: 2 + + +# network architecture +model: + cmvn_file: "data/mean_std.json" + cmvn_file_type: "json" + # encoder related + encoder: conformer + encoder_conf: + output_size: 256 # dimension of attention + attention_heads: 4 + linear_units: 2048 # the number of units of position-wise feed forward + num_blocks: 12 # the number of encoder blocks + dropout_rate: 0.1 + positional_dropout_rate: 0.1 + attention_dropout_rate: 0.0 + input_layer: conv2d # encoder input type, you can chose conv2d, conv2d6 and conv2d8 + normalize_before: True + use_cnn_module: True + cnn_module_kernel: 15 + activation_type: 'swish' + pos_enc_layer_type: 'rel_pos' + selfattention_layer_type: 'rel_selfattn' + + # decoder related + decoder: transformer + decoder_conf: + attention_heads: 4 + linear_units: 2048 + num_blocks: 6 + dropout_rate: 0.1 + positional_dropout_rate: 0.1 + self_attention_dropout_rate: 0.0 + src_attention_dropout_rate: 0.0 + + # hybrid CTC/attention + model_conf: + ctc_weight: 0.3 + ctc_dropoutrate: 0.0 + ctc_grad_norm_type: instance + lsm_weight: 0.1 # label smoothing option + length_normalized_loss: false + + +training: + n_epoch: 120 + accum_grad: 8 + global_grad_clip: 3.0 + optim: adam + optim_conf: + lr: 0.004 + weight_decay: 1e-06 + scheduler: warmuplr # pytorch v1.1.0+ required + scheduler_conf: + warmup_steps: 25000 + lr_decay: 1.0 + log_interval: 100 + checkpoint: + kbest_n: 50 + latest_n: 5 + + +decoding: + batch_size: 64 + error_rate_type: wer + decoding_method: attention # 'attention', 'ctc_greedy_search', 'ctc_prefix_beam_search', 'attention_rescoring' + lang_model_path: data/lm/common_crawl_00.prune01111.trie.klm + alpha: 2.5 + beta: 0.3 + beam_size: 10 + cutoff_prob: 1.0 + cutoff_top_n: 0 + num_proc_bsearch: 8 + ctc_weight: 0.5 # ctc weight for attention rescoring decode mode. + decoding_chunk_size: -1 # decoding chunk size. Defaults to -1. + # <0: for decoding, use full chunk. + # >0: for decoding, use fixed chunk size as set. + # 0: used for training, it's prohibited here. + num_decoding_left_chunks: -1 # number of left chunks for decoding. Defaults to -1. + simulate_streaming: False # simulate streaming inference. Defaults to False. diff --git a/modules/audio/asr/u2_conformer_librispeech/assets/data/bpe_unigram_5000.model b/modules/audio/asr/u2_conformer_librispeech/assets/data/bpe_unigram_5000.model new file mode 100644 index 0000000000000000000000000000000000000000..ad6748af9e3f3ab9c36052b28d46084b7c8f315d GIT binary patch literal 325121 zcmY(McYxDH^Z%8m9ttXs1+bULuU)YV_FnN36ctPAUASBl@=5MEK?PBK>iqNuH-D`qrwYgi?e zoT$hFQ?HuQuv$ZhOj@p6aCNQhwnQYomq1$Cxr*HN&ozO?|H$FJ#?_)VnGWT9A*HTvFF`x+sM@(4(Z zPs^;Y@2+KnM0Q$uZ;dJzq-(={K|c9*S?{OGwe(H77U{9~gSFbxhV8QJk5g-(6ZyP! zdg-Cs=cYt!Mt0le;aaxIb~&{V6jGxZBs$Q)L`9i64hpt1vdQa&YE4D$N{c*ROS@cs z?jtiAx;Ly!4sA`jRFm926~Nl7B_mUNK2}Q{C30!m>td&~ z<4#%) zu9l>6rP-mTEixfR$l@h4RH5G#Xe*O~~?WDI$ldpE{i@F!pcg`C6@vLa|K_yK$}wJCZvm5ww)8nR2^qxy)&XWLY*n z;`LBkN>=%qkj0FO^q3ubzA>X=&4$(JQ2AV?lFvx5hd?YwB}a^Mk2h`fSr1L=p_CB z@e?7f)uN`*pS~UiVzq5aq%$&Y479PI$W~x~<~kqMfW~r$QL^D-09Hae(Js%N0U2jd zjVjX8@Ntb!X-BzlU1*EmL>>EX%O6%)jqfJd6%(}R&q91MhLr~@OdqMGLdSQSEfV9twIA{ z@*1QSn`n`jK7xux-k6{V{?uzhEp|lipC9F93sb@!r$E;FX90mXLa)`(z({1Fi8A@D zWX5=uFwyS$HMFj}42fm`U05rv(v&MS%it3L&)N-dN%e*e`#S(%^!c_FfR&qR&qOl*Igb!kbYa?I=f$-M`2>s&ycXJuqhjRn#2k;% zltI55@(#3B4!wvj(E zrXu@)3R!DQX5n?ehek+=vTU-(x3waY87;H_#tvkQRl3;8TR4D9L%Ba413;h4$%@&8 zjDslACc{2-vXN3puYlB23UbgI-_>S>Ql?lUlfMoGF_yB4R7Uz`p-nuji10DuQU~CI zIi&SXPf;w8V!L@xS9JZja*gk6InX&+F^=5Bfl^+}7~2oP$}AVrwweY(!(cuq4G?z_;C1_CZA8LpVSot~!LhNRFvxSf~ zZ$jIb8f`Wd$m(1U&AW7=19XXUMK1XPz}PA=7=`d+u z{-D!s#d5Q3yy}ur;Y?mm*}#HqB0la*(6%fYnR^C=$tbTy%skWLF+P4t5j18BnKpU9 zU|({1d1xd-x?ZM?wtqEY%b=uH`1?Mmo3(#k_B^yN4iRh3dM|;*y$EG;!Ec_RB}f0; z@pn(49I+)j{2vh7jkGtd`BSa5Jo<(l-3yve<%D$DpP)%M5oxkl4z9<|WGiy`D36d2 z;(zcbfS5IwROb964*J=$D@tP=q<3tQ0@aa5f$LvF*h)dfEd6gh1z?$kK^)1WFMyat znslW;=u=N(!~CONmxfNl7~a!DP15fmLX?rM=4GR!2%CV~n%X5(gsia{I?}+497*Jv zV!OF&sxkKU4?CD(qL zmT3n8^k`U}wNSNGtHxjb0qN^)(rYjw;}F%Y1=(+MItWFe9rS#fpbdm%CY8{saOj6X zR>2G{-sfjX6Ii8)NO#)m*V<>DYH#TaX`jjumNcdpmw*1dpva)Q`>9<<4wxaG2mURU%jv7%mU+WG@vSMDQZcb49I&=DyTgPF# zO0SbG3d-Q!7g(^8krj^;M9z8TW%kPu#&}kH_Ge!^-K-<(%ypK9QrP+ZvJF9t8WmZr zKHACYOadWpxrftH4wY)aAZXKciYR+`K*273=lP!r#?y`}J#c->VZYb%F6iX8#sf~H zu0=BXVQ7=#&}xoKtT_w7gpq=mw?BZivRV>y#R^Z|mOu_8d;L*M-A-SL-`z3 zO^>>GFM?KwWTue@J@aq?E0&GFw#L%S9LW@dF41QKh%u5+q}yfE0?&kfDT~&;uRTJN zDO^73`d2Lh{k$M2^n`}tPAF`PhwUTnF><@VL%e)Z&e?&W6;Y{{3&fk*+#*YtJDtts zD>As@pIWY}Zb!1ongAx!miDj*c<~UBxc9P($f1WrTLGD2a_`YlCIoh6VNu@UG$3ur zg#3AC{VQvyZYfqB0TkDRH9jp5PX@63SwGX#>4AD06r(b&dfy{JRwPq+a*5}FicE@o zyRWG6oXEGRl6>HQKwyCyKb0jImzPtu>U{)^-)TdUZ0Su~pWo zaQ{eMEnb3{>YT4|-3u@p*~a#Nxd$+N2i(Iz>{d7&F&iY!;9v^GIwhvgK3 z5A9*!T1xWi<^B4Dg zy%vIsG085TU^wL`Wv?lQV@VnG5JAf^RaVAFJOU6io=8=s>2;@@GWn7`J`fg zz70(oxr}`F5kV7!YDzjHkNOzM`fHZ#=?%jdc=~jav9-fOXp?H5-Pr+)J&$DAVO3T!agC&DJKOf>q zOCqc{-AW+VH&GM+JJc!m0evooGX4|HwDYcpj2olMq%!e3=$H{x`ER(*V>A^@8M)$a zr}Mf&Pu&X*qm69m;~=Jpf9~^GBr3@KC!rBxg>CD=>HaO7VdePc1!!X_$0&GaHY6Fc zp*{XJOO<0`e03gS8>?yg^L>bzZB=BbXJ^Zqz(@m;C{&zcQ zDy$mAs6PHJuRY?%I2~2#e_!qcO);oFXB=w5QcrAfVMib ze6d*nmi7p#1lb&R4m1+WXusL)TnKB}LW0FIBMqZLtZK|K!!Lrej-1Re!64LKF9Wgy z3%WkG-w18(q?2;PEuOwyl$n#9YC_At8_IZ#N|{8nY&jVqW?u7}`LNTe1gb%Y$2@_W zG72*AX#nFFqpzN$oHE;!sE#fdz2-?0!IqYL9blb?HJE`IRBFI#W%#Gw07aP97P;mv zf>y^8bGq(-{`m^XifO@!!BFh^4@f+~8Hc%5JJ!fH3jI${ND~@OGO{<6)vD6O+WY?h z)#-9IBb^WR#I%UaRMMgc1>&87(D6*5CKDY_mu11Mo43h6EfDbDl9Q{d1Wlr75}f-C zZntlwIZK1aR5~GJMtaN=D{@&5{~v(WF`2>al9mS*(auR{oO19z}V9XLr;i)qr<4HMFuBavS zrB^L7Gr=m02*&+BFYhjeGI=-3kH0}!WlM=DqR@eVf>_Q8#@tsOJ6VGiW#=^sk}#)A z*Q#qn#8s@Qa`#0K2efl$q`E$UagV{gP4?;yZCoT1lHJ_D7IaSUv4zulo!?g7-f6}< zCaXTs##V{J_tAvCQuJ zAVHH3YH41YXF(eaOqlfHXXbc>lq$amy$l^UBD(Q>C@U`_w|_o|)GnQnl@<}SjMRWs zkS)Fhu#LU0ymspG@V9_gd^&*{=^dplRVuF?bhjToLbAxl>HgoKO~k>{70H-o9wSUF zrGKEcp6r4_u z)?>3W;VA#aerWcwP&RCaR#}zQZoTnIU{*Kgn6fN7#cAC$$%G=bm0t-~*VoSiu+h_) zp?J=hejn~}n0Z-hem)<-1fHZ0cU%Uk^9jT2t*Z#b95LvFPCVXIC2SD)9spu}rh?XYl2cJaP8(E@UC`N8wodtXj;q&ehN3x> ze3?1I!t^J(??S>lu5xn9yiHJQr$?d?D& zS3R>VNRRtHPAX9fvv%cqAS;D42>EI*q{)U|mTJkn&GSq!YcY8Cc?ZB4iFE23_nzl~ zjZ|Lz)JbxXfnP!zTkHjbCVtc(K-962lkYpMQp<~;mzMpyI?YBUEkCUeZQLbujq>C= zkk&5cOl*$0X+tn8fT=i9V0`So5s(&8l+*Sl7=q2NBJLF+Yi z)f=-;VH=vNlyTdfDOF_UCg`~O6tnpdkDRQ^JxW>RiZ<>Vd1wX=>qDcQRe`WNM0wp{ z9Xtv^7YMl7`65r*q&t*T#zLD2ZG#ud_16KZ2rJTc0>M}ujJFm^D_}Czm4uac{zMRC zh5b@VKEA_g7Ws;7e3z$Cb1hR)mwQ3TzgUv)Q~V=`gv$JX9t5#!>+W^@OpD7(diN{~ z;-qug%N{Ao95!?=q|T3Q4_En!a6B**a>7scCC4CcT1MFFk_>X1s{ld^dTIYZJRL(} z_s*-<;_56CN#`yA##WgnaOxV6l&E9k9SvK@Oege^m5#MrZ%@y1MOz=cIRJG|wKF3T zG=Zh`tnF&0|78ouCnJ(mcLua(p@Es}Bk8t>rz;n!^<_sv8%vGsL&qNrY1Olt@z68? zMKVdgktGPbx-Xg1Xki`SJGKzEEL!MeUlt%^&eU#x-f*Y0MYafiM>w6yQ>i)UL0f0w zlu+w^&S((Itfu8=4I*8(3(YcXJVe~_OY+2RP{wMdTxGrMe>;E`j4?VP8{7?Td_`y( ze@=lk2`8%&6CT#V7as?Uhki9VBtu_$;yKS{NU^CPA1H0bsD-p5XU%q?jJ8sir{)3} zTiA|9_(K!P5t1 zja62wEu`TU?UOjN}BNII9zqF6CFpHa~GL3xg3 z_ny!QA1}BcHX>*O)G>O{rXCYJH0~u^LQ`*!-WhTuxACu)M4nk(X)9h=8`8hJo5iOs z^Hte%cc<8X+`K20RRGHXoH6FFInZ;6%z@*&LqOuehixe>%aQ=bJiZf={F#ELy9A@h z*Fz!VLEI!4p6h9ws%mN8db9&}{`19!0Mr~GoS!fCZ|Zo|EQ_xKu!8csb$Ip~XcJ8e z>(9U&A+55BRGAi#VRrdhUo;lk3%*p;S*rsIQ6ibLB;J`Tq zE!RS|MHl)diqx{whQIwKfVlOv(a(Pcnyhu7L-d7`77!q^OjYI7P5ElQrOd%z5Y3D_ zmM!X>4GyvS+11KMR! z1==`9^cWFjixD6y$&7q|EdH$bX@6VmA>|DxN4=O#LdBZ{nYJEUceiKfEpv;93FCabLK1Gi6w zCM!HAJ3r!|+H}Y+ddxl*BboUGL2Gvw8#-lLR-FYD^T=UMMfQFfz?vF4qbd<;zGAh~ z*k|4{*J-r~$S5vt|Nb08&F&yvkS3kETJyf^K#dMH562aW3zw%T$u$B6iQV*txPQ)tYq!7sf% zkTIbxOKT4917bP0<~Soiq@UAKQ?4YR?C&W|o0O3Udkh9}UIrfuZNeDB@!NvKon*5p zSDxyznd@+D9Sm(u72>Vb_NM_E<9NEl)3tS=T41XrU!6{jSkno1ENVA10cOP_9vP7N z7m0#XhD7q}^>;y)u;q{OG?SIfTOCjvURrJ#4iI;ngiIdkpIdVgUP@1%4`4-c+$`r_ z3~3^3Q;XLP*FwkKsUbpD<;`vcvm99*_8Sjn97O1Y8M&|y;CzolcJf5e6VnN{nwvd6 zj$gYz;9t>k^U^p4n%d>)5`Cr;jt3Z;s_sp{dkDyitAs({VVb8esL6AO*P!WU)s);Y z&y%AV26OHtg{-f=yqrH&vb-jGIF=%^T3;!3qkXM)xm zEUx&>ck$@DNQc>ZD$>O2!F8J=-ssKJ zy0yoMO1Uz<p?P9SLgsxQvj$a^Q`Q98eyvgypTbgCpw77eHHv$xORiOZ)!MVBq4`Q zhq74{6DfBVRO!D~!8i}LyNhN(q7H^ha-Z1{R_VN6i@AIrv@xtcgzeJvGk~}&P-i;F zE}w%K)5R2LWNOPDpcrDr+Vr0V1Y|-Pyn6?;r#FI+?}|;Fo?L zJso`DUO3nRLTpva<{nAdYNE@Tstpeh z@C-0Qv`d#0p-t4;qHJ?IRNU-L+rK9uE%!vWtZn^q7Q`yomZ-3te%9(K*rZ7BvmuSY z1Rey^cm*`vU_z8>HxQ2Hnkl!co77u30a@uoGP2Lj9)TIXT0wIkcMFh}r&=KHgm*eX zg;>9(i+yKPuEoDL8REFm8&WrK%_o#CMFljl7Ts8b4^v8Qe$==Tit&fNg5;^|_eY}y^txDD1Io!@7!4@PmE9j&$jK_rZF zA-y$hOa})86o~)p4HS=su)&h;>j;Js-L!Px)Ur?u;VoNw{76p{8>P!mAo1DGFboek z_%H-c-x)OSAhdgNzdDH;Q#=qd9y669<)&rKkwC^s8D~i*nC#JxsJjN8;*e88tUbe$ zHF7X?t?HPwv_;oG6O8)OYVuXa<1>oeWNIU{mC8BT8kF-D4|TtUSfptwnrvR0l5 zD#>Pfa;WFlrtYr$wRu`~Y1M zt?6|n7lqkv!|Oc}9TL&}_a*?Zcp@lJ-`xsk5{DOg?(^q&W5;*8ql zoe!bn7Ob#ptp16A9a5D3^POtrT=-L{xRY?}P&s}}A*+K5LQM~!gTxu?G*SH8W9Z5N zhaY?gVl1n7ep+7m*@0kpkj+^(wSZTQ$&mJvLjh!_X6c_SEJto`pD`n~$V4ULCc%h}=iYk%2NKISp;o*jx3~D= zVD>yEtl8U|P*0V&&vpVcaYxmp9K4H1!Se&_FcNrbS1`-8E%+MTvIl@oD|)Vn7Rt_k zl7cl!;_;N|Tc`EHVp~7YC7a74`lAj4u=df(sRi|a_d`8S3r6;oJaPnpO%9EE6|)e0 zrr$f-qp|w5rRA$rJu5u57+jI8c{-5QD_I;S=bZ^@ET>WSteKumcs`6S2K>rN2k`A> z{Pk3TmeUz#WQwr$M9z%Q%y?9~5~81x1+ePi@fW(=O-&vri@~`pXS8}8HI3?J(rt$W znb?wQCZDD>69xxt&F6S>cD%6HbtHhbw^dVC9t8qVtXI@|{un6Bt6YSoEiZzWhHiA0 zTnkHZjy7i+JVW8Q+i)qKLYG|%5_bZ&3Flq|X$_ucj&7EZCIQeX!&0`|0}ydTm)MFe zdIZ|CORJ5iEZ08@Vv=gh$;VGZ#a*0QROE~4o*<&iaJ1PB5MADyr0;Y7v6Kimo<5!h zLL1!DYsmR;`d7XB%2wp_d7c5Y967G^l||1* zEpnHJYw`{LX3G_^{%7{XFd(k{8q~yvYA-)6hBSdRs&)U)@1U*vL#lGj3MlIr*z{7( zRCn?!Yt_#^7kX zzJKGin?u<3{l`Kvsr@ls-- zknd(i5M+oouUsN%MYPdHWS?`Pt$CP)*@vxqp2ba6MJ^#oQB536e{~t*Sgd7EDhjgq zDDWNY#uTjsV+aMoXv3Ex6nRdMtaR@ z`5xMMFJ`m4{gNdfpLOh;rBEgs6j&6Yo0d5+q^c`l)1LtF#B9FhU;Zr&cA3*@?Z71F zGim5T*!W0SrGIxQYf?6mGOG7PEJoCoof?e6EOPS+0`7sqIc< z=;2|6kxoZV903m<4Q(PR6m>WI$0Yz(Vk6ETdtd7DOX>)|_Z1$WyJ6@Cn_uJcIWU)R z$2u7`w@Y*_q)j{ca| zUYiPLOmhtauI_lu0mceL>6d36z(Rzkar+E_xGN(nUBb7R>5#fqX&a4t9>~}Y4@(sE z`e5UmfW}--ccZ^4Z4ye7^Q5;S;guIurfSe)W?H%6@}APhCu%a%U+F!In`o3l8Z?Gb z3yY1+5c|LH$-@rypO2ueAoZuHe&U~b|0XZHF7h1o2#s+dn|ujmk`4Z|*kitSgnf=G z-qB(Z29+M^FZ+ftykjIE_8mbhOy`W&Um;`ms)Zn&ek*{icHC#k%X3PbutHY|k?!f- zqgLgnM3SlCitYfGFK>6qTI)hmVkse8_aqoMNnSnVco=D8Amg8N3KR(`Z0gBVF#NHS zmIe!Nldh?iEr6_pnCCssf2m?|q4bx2|8bHd(c4&Fd36kBo`b4VY0#9SbJ;lqd;mkFD8Ti>6T+XRtBpE4hSb5?}(Z4 z~Z_c%pPh-5sRR2x82oid;33E=A9!O*P!HWlzFHpc34( z0zywy-_vRwZbfQ84fCv!5_9|Hb^vQGv@Q8;IHd8HRI9&`Y7?k;A3HW0a)Ux-Krd%+vBh6=JyYrh3|NHTf3km}xAkXmc0b=Lq_e zx?XKI#SzYk^Eh7(P=r2&XT}p#{UhB=h5713AXXucG!WnV4|^27Gl3K~eZs0N>d~&9tVkghwd-ec?#O9$1OeC>skMtuChL^^t@-l9Svp}S@Z&kF@RSEo#}x& z0H%L5ztys2U#nvrB(wj(|KtrYsWht5FK-dFhQ$~a#=@|9 z_7zjYR~odhLpUVT3oS2v2xMYrzpW0p$A1bEbAe|;O82MZ{)OqyA{}G*f9~<<(&b?M zoc;xvan`6loekeY#}&@0_io1@0OIL~F1F^6kj4-`R87n=OgIQT95_vg6X)6mKe46L)6%Odj9hj!OtP|vSxM|3Yc2za49$*qyUE7*k+Syyk7;IW%$yA(Dj( z7~5Q~klVI_viVN)pG<(dOL zr=&JR>tWFG_D=o0@QI@XeSZX~)fvO2UJYD+B#4!WFKswjf8-b-`Y|3plaD26{9@W{ zmeg_3Hc-$i8~gj$f^H9P83@h9q6g%sok-Y9;?PW6=iQS*OuF#G%6a9P4kVdb(sFFt z0oz@oL#*jGr_*Kbj3n=XrZ~2=vg{thmYsS% z!9b@eASRtOU09tL`ak56s)cZo@Zx7ctO(?lmV2J{7&zo;D;8#h)EHNPzT_MS3Pqjm zetikRyaNG8I8hqs>UNJ}oArd1|>SoePbv7&P=2{vLGx#%|_%QEzJ8T=1`HC>V;8aaApsio0Hr;2iTYzH8V z(yqEfsta^Hq0+R+bcZy)!)3L!bYIIO;P)fO*Id?B5fBR@Eh7z~=rjGYt92 zhg$-~jaABIP*z_0KS$Uss9@IE9t1gXta8cD7DQ?Ia90cFlJePZ1g%K+dW^dX`#7Kv z7;s~0UjUO0(=e7{UJBSB$Y$2&gxr3Jr@(SdU%d8c2l8Py9dVpz!6lvjY zC}t(9wl4pj0&NATTk=1TImwn&PJ7m4a}69<<=N1PE;ymR@*;%wR(7tc=-o93#Mn=U z!~M=LS$uAvVuO0wT>_+a%d}Cb#`1j%JS$+>()9%&_igGUAh2S zo_Ihp>eFiiSUxHBy1HsTXv;^Br?^j(kr^9+SG1} zLE<$A3nEvu8CK^g7-y{8MD@rSubA~%b-Px14f>Bq(>uE1j?G5fI~F{Tb@f@aqbJp) zMD^p_XjdSsN|V04w?OII6c^O4!Fzh5a8iIkZmUD7s%>c3+M8G=BU160#*8|Evdkhn zzArK8`?fgkz8}IZ92#<$$Nzms$gS$r6zu{$Kenz8vY z{u%E@*-}aSjJ8^ly^i(IDePO%^@pr=9=(hC`SAe%k|kaEvHt?uoWwzHZQp(4iJ&GH z2AXQKubt!wgIA52`ws@8*YY~^(`OK@^+L7ht(F3a=Lz=MXS6_CW5=&8Fzs(q28=~- z#-pt&AXc4{sz5PsX{hxG~u}0s`)?;y3peX|72S7 zWQB~8u*3z;=BO(?US=34^YHe6S9@M~Bp}%%t^qJ+*%RuCdB3rqDh;A1zq?=Wsr0@j z4%g#7l^S7C)6Z8V?tgmvwZ|lSb7}CF30oq4j8vXJo!X_17NUPA#U-;P(tn>Ohz-&cK_}oR1 z4S$EU@;GdZr1>vsTbx-w*IxmpjgQyQ10C0^H9jL317ccN|4Tc8T6$)_j67PW!zuM8 zYw?{iS#6ZN*CS|MJ(0#pP|+E2@Wz0~GKWd3N*%Kah}BSC)48s+1%MTSs2ST^djxep z=ehmu9nfthI{i+b0y}6)?%f4C9{gNYJZ)DG3*`OV9K-8}~!Md$^m?(IOi*iMWg z3Q&*cob=e2pyif}cns+vCzDKH-4BDbF@la9&aL67&yk>3DeThZcf0~740EW^)%(f+ z0>+J@x6LjXP^a|`-K$T8wvv;a030+J(t5AmAdRF=p*RP1tGVYiXlqW6P7h8)F)XfJ{J#?8y)2TY0zSh2XjaP>vH{13zyUAC2&K@s4*i#=IXsnU=0mwF_#In#A+ zS1jgNpB8!Pa*v}AWvc6tbiT?nLJ4Fxx^yf+Jbf`G7C7;}^;(Bw+l)cRHWp~E;ygKy zII1G0<=2}CTCw47)J2n^EiO|t7T|jnup%%B=~=$azZ1x6jYpz3{yKMoSgqM}q{I93 zm*3|J=}cKoxO_4Y<)TRUf55-0BBI0TSA{HFmV_M5oSzC}ZK5`V-5&7>sU}peiah&h z9pQ+HN#n_BAdGsQAz#$6)s4H9xWGIGZCo<6FebC`ygD7sIvJM~Pkau_3e>ss##xY7 z_t?K(uAB`-{;C}gnqz704cHG~g0dc?H+A)Jm`nF_ExKAmM!re7)>*jOkd}4c0IXtk^jz2avetD|a3a?vl)COJ+HG0v#caD#%Dv0Vj_!ml94dWuJ&@-kF`S`_tV zk;j*TSlMa%`NMyD3eM|M@Y5@=U&}&$=ps3(1AuX-fVM!PqeHr3Rgp}nLu$R#So!Y6 zvN~}43vcc9~`r+k50l@AC50#SS3x{2j)Tz8^HD z51+3{MBgV#h(O-#>S=W+D0tCDPUJpdgN%i#+*S&#{R zt%(G!JUzRjR_ojhV(c~Qqmn&tgSI}v$wCzd%5vcy9*4({Bk6Ld)2(V`x^gnKiA%j} z+k>vyI0Z0nW8%!7>T#$!4?3&y_TfhyWSg78J%hn@!DE1N17g~4lH;BPKw?$3>%TD# z0->u`JZidq2)CeT&xEk5wN%5?TK_0w9H=YzInP0wWYcJ`>cKVOc~7IRSIF^;IUpvE zGB@I7-b>K2IKoZ|1O0NvEF;@arX~F{kQK#43G&=4kTA(wEWc>jK4sZ5^?ei4YR80! zmbLX;0G1m{FT4MWbesod9f;9({ku?PrXF$kYuGBuxroNy?qd*VP>=WU+5Hp@frY!{ zt9=P!~WaJ1%jBivQ^pbu*0cb;@RiCWk zm@Nd$oO<#f9$gJXJlX!IM+s-&X*uREkAhPwm0PhKz+}&>{5*29(gw96nN(0|2Xz9l z2<`eP{yR!r)i@WEt2%r9R6f^|l*DQtKdlZh=QcQ<#RM&ncJ%~m;48=`Yder-(y7SR z>jU@k%0YKKM;rv~mIuL-|FzhhwkA$%GQ=Q_NpH$U6@hDKs7}tGHLgjr$=n1r| z?0<}fSt|Iq3Bp$8bd~Bn^0EV9o7WYjx=F*SWI~B+pfVCM> zsy_eyU_c7g*TGjlov`%*bQ|e+24viE+p+PsNS`x7j0+wzi)4!gv=tJ(Ov&$`tVb#6 z*6F1tXe$&+1&081#T=mJ%w}4Rp$`rLG3ikwR>AL@0c_kBsxqwL3DnP@$~;;01iD{s zmS+_(-h%hU5fQYxu49A2>`*P}J4NfA1#B$ao->jc&heB<9iHo+3tbzY+&q(`6tJvQ zYMQy~f6yjx&6;%miL%wLWT__L|@+^rnvVoaj+7BIVUb=vIYj&Spf^?;ekiHry@;PKJ)_6^7{D z3dC&_?;$u9xZh(%JUm;G!~>oUf4$cvPbqEn(rUgw)k(eceAdH|Frd%yb$OIaL6LR~L79Dk4_MA!B_|v-_Ob*XGpy%A|yI%k>nW#-jW%9xtkCWhu__VyK zKz;i_Cs$*}Rxf!ii&X_W#^;J)SAxR%SknVFG(ziCW_|fkG zS+ncbn$GdS`yf_nURq}FM_W!&%xcEVc4#I6KuS4Q;c*}Eu{J{VI9&7H@k7r=Z_)5z zCJzaG?767jsw_Kv4q!D1*6$4#L0b)YT|nduNRt*iE~W(j(CSMd6Ar_!_OSHbUwb~K z1pa(qEQV(6r9-cq@*R{h&sho6?XVvKtQg&yZoUN4M3AtT+D={yVtlbzYnLUzLK`FO zO1LhHTw-dmQxZlIoi&TON%E16rxd zX<3FH0$^2V+Gvr#4}~^P)6A24X=nZs^(YzUp(~E|C~P!S`m)6-$9a@i9oVJgoyLCE zBnJ(28kgWE+2KUb0{aM&j)LWT=Ks;!XAd#h;33ZyhH04<;B( z0ekWeXIMJ*fIBX7~oo30ZbTODFH z3Ny<TMn=vR$)WKg=Pn<%UZNCl3d*DHi>w+Nl2Z0gHPh3b5LzPtj;` ze`O;Y<(THRgF`q zaPeh>>pcqp;gywMN}INXsGq$7DwdBPx#<**iRwP=j)-EV;|0nFA2fPMQp6GDD@1 z#ScQpm1GCY68y*$ASN@ z4l(tH>E`R_fnuJ`QWeSVv%!p+WR<^jn*(XgpdRZTp&efJe45ob!Zvuj*MS&ftfJEY zO;5m#Uq+>V>upEa1@PyI@~0xkE>8_JT<-l4z!(Ycl6oJ1i_aXhyPwR4MaAMlLrX?- zuL4%jV4)<=T3-Me$NKkB7!BT6#3Jd|UFFmDOV23LrX6BS1uPEx_@LH(tB_@+w@|41 z?cX_)Me$*({9p+PgEU;^+~FtB17BWFHn4OkWYSbGvL}~9T9;`r%C^5kSpobzv96D6 zFY_Fj5qbS9FL(S6WK~vYoV;A{kLSUoAs??WieAjCs&L@?U9|k0a}9vW0uZv%h&d7!W1=b zU8lJ;$Dw3zPow|M8BPMu+Sucib<4cXme95KG;`_^TYEAy?lRa$Z{x{Qs>Xk`Ei}!* zwr_|$z8yr|W#J34PTd|v7hT@d+jvL9vE~;JBGnJ!sGU3selJ>?Mn!64vQ4TxL&gIP zD^o!xDL{z{Or7$39|#j@r5%^Kjd!opdfRG`I-M-y$g};Pe79PvB}bRf1^WQOqCRP} zsIMpIAJkf;xgWIg!lEzz_J=gt$4{z7@^&3#BOK*2^v%f!cswq+vKgf}Yv>9Dh4pPVpK_lYNyxN=&8pWz-c_zAIQJJ+Bp|u#avet0I zszD@V&Ip1gHtgtQ&W5u3=;Z`8y-UM+U?!*xmgutVccCZ2&uR1jK^Z3zdj(l^IkeR# z%fMZFm8aJ0gS_E69soYDbjsKXgsrN4W3`prZU(WcCbIfOBL`@=0L2C9GWW|Qk3!Sx zi>uP-PN2A}hkIB@+yxL%0O8qB)jE4U;2Cj_nUVH7-K_uQcFh#em=`*zYFc)F&>_3B z$)9#S3IxyG9LBdv^DRE^`O?>$W!Y1nC~Q&4y84VqY1F-P=2>VH68?yiRnn@M*L$Rw zP4~}DX#CeGX<}0K5WafN1hM+*duD3==joE?0d2|UN~O+K%H2>!O``h8pE^+td7+-4 zo>AbQILq_n>3XgrsX}CuQ{V7py5jK1 zo$mlx?O3JSyCvs-I>kwW^VVZqWp?J#B7m3v<-u@Ao)er`cFRw%ML&Yeg&%9?fo-s?x>* z&V<;V8#ky&&|TT{8$vS;sV>-M3;#x)_&Y?Ut?OlmWy&e_XuokAFcSq1**U%I6(Hk+ zKjdQ?mgzeY$=b2@ml=@^+S60E=IA2CJMbVNOUdw66WGy;7{A;BLkJ%n0$>$N>z45C z!#$T^*hHx1BY^DEbNJVB*301F8F0%>kNi21KZ=OdRSn1Ejv-u|If8+U;XmtGKpR*3 zEGb(DwL{!`9H=&ux;cI_z|+N72ASN~J_#`HAKKM1IA;~Iszoh4quwOl2iFlUni6NN zI>J<=`u6!vo>8QmD@OI0I>aoBpFb}vD-;hSj#}ST(nM6`bwAlG=LO*mqvNVc5lfKZ z&mQ;7Lz-a1^eBxj045B3R7+=`VlS+3^mRg6tki@>28--OVBnG245Vw(~0$? zp}+`QJJ`UAXT$k*u2JXWPE|0ISGAyL?=fWZ!bqV{i5@-N^Jf0=$Aljr0c>^Qg;800 z4rI)_y19l^l3hjuS_L^T;_Uy5Q4Zh$gw{D$0V|HiZ>Q~_KHsBY;9;a3c?kf`&h&=z zbvZ;_aaDHjxXNSe=?DK;dW{2gHV&3s#{yU#!y-XXPOo=F@5sW&RyTlH zLCCT!SB>)+>h6k0`ivs+2-LUe&?P2M0D{$|ZlZs`*>k|vyjccKg0^;~19AC*Qbye2 z7#-c_+4Nm;Ce?DIRFyC(Q$MNR3u$HYml;8C98rhzIo>*_$2@gEv8;aSOmKUDMiDC; zpG$@YtLL+IEc}(0ZsGb(^^{SfRlBS_;w9=nQ#Jkd>JZ&l9Vn!A8nLXQ@uy~J{I3q! zw(Oc0Jcj;lEh@uoFA8a@{{G`j9wm|1bu;@)JqqX9$n?h7K&<{;SqUCXw<~0oMSIm{ zWu_wWu*5`m>FXXr&tS-9`8-F$o{v9}dMbDPEU09DWv?{}uH11h1*<|nl^H)G|r?5vS+6{}lXV5ui z_wPKR{yUrw?Ji3^A=(kwZ?OCgP%Q4V`YL5s=~y%zB%x1_R>U|+ar~|gyxA|F5#5qS z7xge;CXR@A`Bk-yBbqoES=f8F)Rb|3S<;Z$f9i-nEsAT>v2}!Z-Bc!LD8ihS=Lq5Y zWrVGq@CP;FS&|$61Pohejeet2R)}7D({7?j+}F6^UywiQKpLY#UZ(#=3~Lt-9OTp$ zo&}GI>wbJfhYf2hRs9VSrqQ)JgTtHJ*k04H71JK>)LycR1G*RCZ{`)SVv2ay&RrGK zq_2O~EZ=m4CNqu>q(gWA7IskoUB|wmjmgIvR?Bi#c3zL5RW{fjSgh9vu?FMM*4d-* zv`H_Ilu3uzfsfp*j_6S0gl%gOctJjST|@3s+PWFZ6zB z6WduH7zBcm{L~$wjg|QNk@VipA$9rDe%VhUraXX)UG>#zm@D%#*qnhH@ zJ^vMng)%J<>;;143cM@xZeRae(tjII%OCw5!QQRNh6jSgJ%VE@mhU4x3Z?4PQCA)3 zh`LL%^4zKjh3F;tuKfvH&3Q;d2A=>)55x}%%_kZFW$ntVkrA2)w8^rZ!C69O`QeFR z#sNAHjg%VFp=?ZH1;vbJc({NlQ_pSbS8l)A{R8>tO0d0lo<&SVBtfH7n zQ(dl@Wq(n`G%h<o}|v3J&u;*dIG1{EnQVuHx> z+)Muor12AUtc6P3XI|ZrW7<5&7M)_bDm$zmfi>flvpqd;7c@(^bD)h)nt|7Re^tN= zDCzuHIL{++?}mE(rhth){@*MTjrK^)eW*!CoeyB`%dDx6wP=m~#sC_xdEOV@??On1 z0*7?`1(6a~Y&yeRTen~2G!0ylovwg3K6Mk?A}1s$?Bt)g$M zGJ|!#0mPcGTA&&59#A#uC52;l&5eV$=y78`wJyNC_%seAo^2SKIy!e54`h6yP$RGQ z2>@0ReOOPfzsVzTtin1maiV9!t6>>EQM}~lI;4gbhUoXVIuteq@N@d@4zWvP8E%*T z?gX;7K-FNo!lH42V#ZNpRktSpceexV3UMN8t^?TC87Ge_VA+Jtv|coxejk|aG1&8P z#uu*KR`2(iv4JI$s}zex(4>2cXCDMGY3h**#ySShtcL-uErKIryZoU@98I5!%V@ES z9|g2Nf;CIVKLcszE^Y?gp%eqN#G|5XOebt@q4}%2eyu__+!HBWvZzZKoX5@tkG21B z71!)Q0gi>&)Xt-ljGus6u4pjfH0y3n9ak@}mf#y+0I(Jgw;Y>iIi1uel6QN#o&c|{ z7WrBMOQ2&+PM-^Hg@ivWrrL`XvM8k-Cd5v!*Yn^dMy?4dP@CMs<(5zD2nT5T1m5HC zcqSZ6Me>KzR>5#FNHy5$pL#xO51{C8KL;_1C(%(hS?Ce;*(1GjtcYb3_L{nQrxmld zi=|Ia*Ddmh9G$6qJa6QE17_0WB^%Bb*7^}39z(%6-Y!EGs&yd!m$unU0j#o|2k4+# zw#<pL8bs7gUmh8XyZd~hLCl$uaSqkbISG#oo zn_#VBf;X2e{s+idLBCSV!r3c8tPp)kQ5sg-s1`&2iycMb){c&Z8b-3T6NoVzuIA|8 z=FzT>p;Q)mm?bTDtqvATqJkY*?ol9?y)NC_gmb%rS%Yy@C)2un8a2SS%Q0&?ki@5; zNv`by5Q|e^KcgH)tei$pOtbP=9Z+)ycBA!)Q5&2|HH*;-qk00Ge3+(ky34yvAyeEN-3r3q7HJ}wt zq2Y!4HifKU_2R)Szl{T!p(y#`9RQ3I+>n~(#2ulnY{sd+?Rc6ZmTi3VTOx&6l=L6t zq;I0Nzk5M)m7o`V?7yO zQCxqK$BqNBZZrfdZ@2zVW_cF(?}3mtiwS*(l|!f4vrhI{Y_Mg5l2$Y~iTERdQ=R60 zfk?I)>@?bGUS2%|+Jr!t;;`WQW(V}>u`C-E0OIP=u1qzzDH01VT;4ddRF4w;66AhG zj19d9E0mt0;X0y0!vv={!!XZ@2CNxd;ec6sC9>I>|6Q8XovVipwLM7UH}wx zXpaTlUq{RuFP~jVoVXLKkqCu4Exj)Sw2Cybjud3)OB~2@j=%#E3Ru>90g%(y4KDL2 zDvi9{bOk^>1PkUxzV+2WR(t)APx<^>=-SMP%c3ec$K2@2bmyr$`FG=i=xl6} zjo)zJ8P~^lX}!hsiAN&NjEY%V9Jr=s*E^tNOJtHsj6WfuYmZda>Y?`}>68234HDmm z)a0By;=I|2UwY@9Z)aumnYJ`Mo-c)~{H_p>m>>)4xAhV>KX?E*kUspbtdJ>K$ba?)!wEVhmjbcW z_#af8l*VrEvGi#NtZWKcorCjJL0Y%*C_Gt2ltl_y6kc@Js}#Q|VxvT-ws_13)J7Qp zg+PB`Z}g|eLzJA`pWh3zHfyTKUD&A2Rn*!_FTm-^(vSN9slg{0%a-m7W$l8C zKFe0aegIZ-#s1jikOM%hr3&mRwmJ~fT0x)tk;Ml?$Magb(TaWiaL3S>m{C|D17;=h zY9ABBLq`%xZGnw4@EFe%r_8cEp|ml9v$HxyZ+~1pM?H1a%g~?JF+CRJuMsdU^!JoJ z&!>+pH5~5c^H*_^ z>~X4RrG^XLfA=|~9z`zz?60(mFU{XQ-JkH!d3{prgEX|2W9~FTF-&DZjYaLW`po3pleDU%VfFAJG=b1c^=rr%mWb^h%*XU)v#`}R!H9hh_#p=k_RjJeu`PF zaP2oM2P+b1ME3kaSjhoZ(wpUfWdLK6SvwrUdl$gcBTIUlMuEg*(e9oD&N?3uL9k0oG-4r?FBCBOsktk-GykKQ zRS8>fK~}lIbJF)lY*Y^z185w_*Z*XKLMCNS!)T3i>Qa7djFXO9KEZF7L zCRV))EaqANv>1U*Rw&L@9b~29Y5>H}%f%cpU+-Vb#iW`S6fm~*FqVb-%kdyqPOcDJ zl^0I%WE{Jq%+0z9z$D7yAdg>6^ay%wI+AIV04!g$Ni{6|_cjn~UwXB?bQh$tuBQnq zxZmytvIdUtL{gt6_XApe!Xhf8rU1l(WSONu-u#dwS@k!FWKtbTq2BX4$f!p=8+8WY z>1qWm8+0Sx?YBJ&Vs)YeaB)#-V@EHVhPh6ToaV`pLjmPIAha5jm6V_1t5r(>K2@9O z<>?NgsNrXdwP+@gNuta$KmQd-D;L$7H&S2o6v0CSA$;~akO_gdr`fu^;c-~;^axiT zod;B#tAf+3swFqQ=P9|G1+dZk0P*->!^A4VL(Cs|Zq$MWK5vkf$Si=ZV`GhD04EdJ z$FKg-0sSk zN5_cGLqvZ&jXOq3-dqlCtvQ5#rcL+P3QN!7XIeJsut`lMoKaJSn-s7rlvqvH> zlsLDQJ6G}e+~t6q@m(FzRV0!{3Ro>w-RFLtu4}if?kJ;=K7#7VZI|wz7&ARBbiD$` zE;Mfd@xRLTIO#Hu75@gfX~gaG5W^C2Az1J6%dMKo*ygVy8L4%ewJjlI)~tWm8$*42 z)XU{nKbbufl4-A^oe|z!4nh2LERgtG|0>XG=rIR-{C2ZW8 zyKqG=+5*V9V~4;)id#X)9hEl_OEP2|2bg>j!qM9T1Qoj=w`ka6^Y>xApWJgt02>a> zvu3B^_-Y(ej}n`f5QV+%)E_(p>!;XVa(d7phq4JWI3y47kds* zXDVhHVeZpe?_EVq|1o=?t+Dft^@!LBRCRw_5o3xu9}V_b1*{@X*u73T(Nl1RFVAM= z1|D`8hrLd+~HnMw_8~{iZ-qRwABu_%azbe_Nf3Go8gaTv^9q*W)Za$@X7<=yjG8>7wp0_3vVkHcZ34}Dw~m` z+CZ!#Jef}axp7z>2saDHoaJd$Ut!Q(GXlg~ONUiEH$G{cPtWmqd7fM1$m;Vt!q7!| zl|_nJ=Rv)Z`$j>Ugp%qi_}Tf;aYJF6O))3`IL4t;5g%gK-vAlQECV$74;K-~Y876M z=cdZ#AXZMArSMH9EnjpyT*FaY6f%)v|G=K9@H`D!qe26{cNahzUrllgj3E0O~#1jj0_kQGT+1yXfzvm5`v9Q9hT?0GYo4NiUJ zC(UJDJqQi36&|&-_^6vsz)Tj6O?q>CFHLKOXc2mUB$6BN1hiV{i!y!g@;JJI(Q8F% z8KPw}kuH3>7!k5bSW)ioomBbz=1W-Rch zf%4R&o>de34P7YKdK`$YHEJ0wANv%PwQ2B^IuX7ELvmbeNTuVzgoSkbwsa`apro3 zB4|kJ!X}9iAguXmNmQbK^X;p?a4PRA5x1W{J9FG;9y<{fq)uNtpr^qpIrJ+469und zb6kVrXzABrRvVU9?Vr6D|2q~ZA_#1SVpbN<-IV3*rO8x@7 zAApuSbB6kHU95=Z#Ee^#mVcbacdjfel(w98Rn*!1yOlSsLEPVG7E8-j9e_|O^iMka ztU}ldE|~d)$?2Wd0PCkp6p{$JGOXnSn!kCg*_1Y_WBaYc-w?d&HuC9lAiD zzB;H?N8ebbGfe0P5;swc`kY;`Hh^(smlAcTy`-R3O5bzR5pY}&AZv@7Rw+NP17@9B zpKVyOu9N!jYVGSmTH)Fo$abCeL9Ek;M*-po;6CgLY^CX+9&#Z<0%TmpPQPf=0gP+I zwPK77A8Se-q)GJyTcDK5K#vt@K6Tn&q^Q-H<41IaUlp)yxLBinZMzW&t;1uma`R^X zHPR`oMfz^;h#q^=>DS*9giaqG*W6+&OU#LvWVaz)>t?#os>sdTI#ey_oA~Vp8ArIP zGH0i^BTh|H9Gs+O)m=RmhNke4MpuO_65h`V~f8TQfW>( z+7WwPS}r{n#M&LcSj#Fw>lrw}BkDzJhRKx!L0o=A)N=fRLe}q+xIHj`HOhzoiWW|B zBI$IZr^LjR$BZI*h3Fi?QYg=z1ZDML1*k}25Ohrp+$NC5lRW|_!}#7PZ4v0bi01ZF z0czc=82T48?w^A}jXzdAGmsBD9n56Hb1Nksh>FxoYp1l=6)<*~#WJ${8JAy)I> zp$X3>N@Vpf)fOf}OaTl>E2>WiUzjV>e6ai}k#XKBQ%|eTG5jA$lSjedi3)aZ_9%38 ztfEpZI)eL^PGw_S9SJWd@c={{h)Ds39u+%GG(RgE_h9U@xK0JcnzCB3|9tuvq}FC_ z$yLrHo$>wus5%euDvPC$?;$``y1FVVVne`+y%+2q8&|xFm~cW8NRuRlSgr{z1hF7u z!-j~Uf{2QOioKzU6%}mgMX!nt3o3f`e!u_Dd-l!etgw06xA z;E6CQp=k;Ly)#%He>*j1Q)Q~e@z;S^Huh!#XO7ncS=FL6=4gCIjKnmdn^l8vi4?5L zct@KZ6A3ptXx6oN1KHHZQtmIC7b%LymXsD!S+nks6vd>u$%06MB33esAM^;2Rf-8H z{!Jmq8r!f6KXfT!>paZbW+t0i24+=K82lWxO9A<n5K?&R4a3(n%BXM18$Yz`G{o_Gi9=V4n{oqFpH??yuD#NxM|yV7=R?kwW?o#Dy_JlA2joghiMXc}1gxjGh*7h$lOp|XwrN9%dK1r=2+d#i0=2?v zVEAR*5oUP_Hvs(wJH>ykDx;}Z?n2ngRl&(ImGhMl<55@lv`fFQFOby_?iBn5{Rqa6 z5p*S#?f(9tmM=4VnLlYa!j`hk%Ah!QFA%F&na6}Z*5>n=l=5p0Fo*~z}JjX za8RTPW`Tb5!(u|gubEcStq%vY?ATaK^sEzNNr&SQ-zp%P3o46z*CS#KxKZDJ>nM<< zZwH^Dy#D6j90*9ykr}EVeRPad$MFt@`sEl9%Oz+V{JqCUfU7!kxhKFXhV`q?zjabf zgRZ6Ps%M=HVik%Ju8d$L6fY5KB??}Taf*;4dU1=1d5sV&Qd#YA|JNx56Ty{sL8B4Q zv7S3MrX+!r4bq9Hff!F&`R>X;op91Lh|xh~xz8XlYYEm8?grqB_-r66EZ+Z+$=(!T zJj(SH^XUgE2@im??fE?=k^Y9w%kAgHR4~>+2v~4lOr^TMY)mP))Gq+B8exNMvm#FL zief}M5d3^Az>0wix6prG+J-=q=1!FWRtEOEFwe~{S+{(q~u^pqov2yF)fO#3;jo38{?w> zu-lenrh^$**dWtxw+pc1VKB>PidS}KL@3-bVsfVjnb<{W6$Im61??0 zFsm|h3U86r`vcZRLfg61y^DSVvyzXb^AL5KklZR(&MXr)2zPFXaf1U#ZKG!iv$*&X z)4+dPh}A)n-v97>{t*FWF7jKJ0zo|WxBVF@?BM%>{{dKW@TJTD@U+71lq*i?0YR|n zln0pWao9j}F5Ov>ui!D3UN2-37!zqfL z&(!P#Y8(a&dl^gA3A6k$L}sa2Ex=M|BH(|2*}foFY1ps&lMf+iB^WOA@Ii;g6cG1V zRGSV5u!gex=$z^t31o?CT}Ohr>9`n64j6dBP=LkKQ)Q~rIf6FYBs0=qcM^XY=XE)i z^G(8X{Q>D67Zke=0gXK>lSb8}FSNza*8y3v3M#mf`J2MDL}}-8w6UG!43Caj}W$kGVbJLFzfp*iAj}n1WA+Z|9C`n z?;M(dB%K|d6FYN}Sck#7(GPfnVDj(Sa&i+_fMr~*!7=687-k1j?`JA(5rU19pCiC3 zgRvb9*S-~GWyHE{bTO~sy$}&B?WB?DAtV=#*HPhh(-hJfgY@r1Qi%SHqM*e8(MrT* zh-rom`oSS@0~*&aVa2BiS`@h00$3(N?r>_7qM#u2V5G(Je@5hLU{5oL7 zYH1}{(swJ-aQO3A#gu~JOiM5Q6v(*Ju@07t^u#wm12nGil9u(~D{Mqzw;l`#hpdU9 z4%0DKAi2LjkDwjCY1tV2MNCddB&eVWTc6W2$8vhc^!Ca(pjM`loa7-#2gC|)mVNcU z)3*@C+GjU_?ZtOMNh#5$mU#C)fM!;y+t2@jfOVTPPM>=GNYFB&r&C`4$Ip>~Yw5n` z7lKw)J1^3l_WXLlqy@MLrw#5)f)H$Y_=j%tsX|s^db8KR^lOX|>`bV`vwjCcV#IjJ zKmI3w8y8im1mXGH|AJT{u*1fv;xV^#E=#nyK}UUQJ0P;;UOwBtsysrrv|>pU_BYy` zzq2v0)h$zIZp$7}D*z6_`3LSzi7+<-kM+%6W3U>b7=s@2z_yX7tWrK1*7XK3j%zE_ABIbJzhysAYX>?# z_bF7ktpr+ntWv=Y8IK1M3!_6)-ZsJ#&WdoK;4czj?NcWcmhE>ZOcz0aQS7_!75{Ox z?)|UWC&uQep5gHBz7b%bO6@G%55V}4?P^%iRtmE$^dy__cOYS_U)CLe;~@l-@`Uq$ zb(5mQ0IldWAXOL!LO?BbW^x2Wwu=F?63H?y>t`rxZXjStN~u2sIz54t$w6n$D8Lr02nOtG0ADpxr8h$-Ni&ouJD%*iBYQSWSh6~`2fbX?#pO3 z>mrw66PgLB!0b8}+tV7R<_3P>9J22A4%3Rt~}} zjY!N1nq^-mEH)$yYNn*bTql29ZTZ*1ujJY3%Ne zUoFJCC|X~?TLnQYTXh9lhp=T$ho(-)h`OewRg% zSz!!Y1;Do&VxF8_gj0h<8iA}xNZqtLRucm!L^A2Y%Fu2cBPi)VM8rIx#vhxKVG~kY zMrHg{kgIqa+kt3NTmqG=p*P@@4On=GK61nop>mHPeBN0UPO$&j3gou>xZcnb~%@IbxEt!|l|r z!mKP=^u8Q5tWFV}gGl9a+H7dZUjBDsaL(NXt!&(G<1NH{2wTh0Ul?MV!w;Abm@63z zi@NXE3nFIfCDtdu5X=~7BEb3Vmp_S%lX?F4elo-g_X9(6!DqH)OWFf zWHjKS4aVwHgjHMiqT^FU+Z9@6vp0xkt$?h>tzj*%69rm{S;0p8XHp`@i_Uf++U3od zpV`^@@83?NNv(10ibzpgQ!azGU*8AGb<#21EzSDh1X<&xPRo%5Mtx|BvDk#3(c$Ar z7e%k|Qs}?It=RBd#ol?A5Gzt;p{yL#v3mU{g7Hamf9zL)#t!P-aLenTf`VqT(!Zd; z=|s4s!Gz!&0@lhE_?@Wq{l5dSjL~sO>f0+t3QTK%qL8F(gemKWlmw#;>A*UDZ<&Pp zdFKZLR`ERgnf0gt6vLy$#D?{Rts{h|FExgz{}yRDx#5{Gg_9vv%ox^j-8sKU8l3s! zFm3~3t8@lPrG(6|P}a8VlPlA3Jz#`QT8iLgayZ8gEgMA|b1~-M7GkBuj0_fD*aX0) ztx~LV3bB-{Kohn{ml!h~^Pmyz4w8&EotQF@{N5uH>CQUHA404^Op-irz?`&Z%ZS;; z$P{qdR$w*-jASW1qi0NrGefOLHQRt#$6#wOn^XGVCA|TSc@8>QLtfY+CL^1*>3s>> zO3b>01`+=aHU5NMBbr>GRVVAaJE&zKm-!q3F!XO1Xc@3IMO$3D2SCCncCokY7yq4F zVQTnle}LTdVTa+@9{`kaZXCe*YXTE#EAjgRdcZ-TR$Ist;cB|CI5ein3Djtvw`_Z4 zOc8q(Zsi08?Jm*kRvEp#r!E19eAYOYKV3K*bP8FNiJt&*cC~m(Yw`6^ykXr~u7Pb7nfbNKn|~Fi%gZC14y@P-{U&ac_N$ z!;X-*{L1`&Da6I3Fk8+SWE}CJF84iN5Mafiu(~2ZF?wAJXm!LaR`373Jf^MZzBOaa zpAaEt*Ptp4P?9zZkt*MAA~e=wyga8C>np?-<<;XU{zah-(u>{MZ>ziU` z>JZY%JbDd~WyX07+L5;f)@1;eG+jtG1#dhZQ{nDLx&KvRYnK|f6gAHgw5lqo zNG=)-eHko~fHC~i>tvc~1Dv!)Y4FV(5aTHKl)}%i5Z5>g&R_iZZ$)5uskTcuzYSoK zO4$cU9{GCHapMM3jl|Md(tVMR;-@%P}+p7BK{sc+dv!I^!wcmdMl73Z*mOAgR z7-m0K=KCpZ5s;7QBzp@mF6)@nq;wqOc8O`o*l7Dq46`s*`1*E)Ee(ysB7aC;B*13_ z5972aoXl{Ek+QDkwev(I*l~$3fS5sXs{U>| zq&JT8&y>e-I1hZWlCTXFrZ(z?39rVts|L0Fu{0AS0&gmd1*Pz9wfA5$^ ztgbDT8|H38lA&6qyABr!u-P1e!EalW{yTPmJegGskd%~L#uDS31Q|Ppu*g}@W%VFd ztl;?Rs>@?4I1fkd|LDH}ay<)^h+qe>M4+WZpVxKZfEXDUNfH&r?;^9rIijlfD;r}N z|4(K9m~n)yNN5Ns(vcGZtR@)WVawpFr+`^8I4{?oCx3?^%U*dgO*LH!lC+MDUi(~4 z*x0dcl-7{Lu8Bl7ItILB24PDXi$R^4_=9c$G6pyVtPOgVgHuco69n(bhYCwLK%<45 z`G2NJkPYj7-i*f!{O*u-s#=9xA|!C5tTT?3}w} z9Cjde9CObBu$pG@V`Z;!Y(o+~Yd(OnBNojFZS{f}t5|aDy$fR)ae_M|j}W$ubu$X3 zPUYf=1ku07-}_iZ?CmhWehEm@%H`N%a0R;BKd}_hs!g(f@bL1au%wrB9Ov_&j1lc9 zM03~~%K&rAzhFBX_ULtjEfX;^dQ2%3_1!Nrx_K z{ekDK|05;Ba$6=I`@T&yV-`1B)XDS}09$R+g9EK};~i?C%e#@3F@pbsvjkXma-Lf3 z=Y2rfSfC<{(BWP4F^KV5r4@<>4UpAi745_wJXY9iMHgpH^cF$bnV;`kPXK z4o+g*tcJokV9z_sXFert9AG(!ACi9rD&h`Bwp^<*0%1!`k4Q0Yk&_lLK~?<D5Z?1Mwlra|<_{D;f+NqE!)1v~~j07CBaHY8&pj8;BAV+?9Xw3Pe4mwI}r)5e+Wt%Fl>7| zZVg}^mZ2(>H?1tEYzJzsfZ~LH!$5yjm}OzxcZvPG?h*-gT7(@JlCLn!Ru0MN@P2(t z795O8f^6*znH2@;hv#4_*~laRKGH8nr_XY6A8#W4f!N~Ij`e-?r*VPor~$^m_a6Xg zrJ|S&gs1lgurA2@S|n$2Iv&aH18lX6RR>3TzBEO2paF8xe$ZIaF>>TW8|hCyAjZ?3 zIZ~Q?D2TC96`UZel=F@Nw1RU1FkI_je{xKXh24C8{GMVQWFu_Rej9{Y31n1Pk6*3` z=n#c|IVb|0<52a#3$QL$Rml|9@l3+D_;Nzv_db_kZuU1#R%ltl#<-rkuvzOAfmUY5 zKE%X7RhZQk`aYih^`{B3;-Ngi$xqe~N{Ms^LoYc~NYe2&#-1Na7-fOB^uDx!K$4HV z9H2S&_YIF2-3kj46g>9}Gh2kZ5?^0T$nw>dPc`_oQlO;4=_4FWi~_LIN=e3D`_PxJ z5p1OmKKH`5c1(GUjBhhK?BKBg#xvKlvp#bPVR#Ob*yKwI7|$#tc1}I@vX}zq6if&+ zQh>85I&p`~W0J-4pgCV*W4NYLr~b!Y5tHQwV{Y4F;c!bs#0v2a5PYin#u!nyEL`mp zV9bt^F@KH1*6bJ8R{G5*#WdvVCrHWdo57McXQ?y^CV*C}th-@`?kGBIa`d6<=I07A zwz0URwXPIku{in;v)F7w#!$AXkS)TLG?j4o-CuDHh*crtE#^IJ@UEN@V^v8~zUpSe zmJ@>lb?&e`022O6Sywn`-{!6eg_(g(M1U+BYX$ald!{rfhQnTNvLGv#-i2pb^s{3^ zoOOb5#pNELq=AB8h03`xmR*PPD}-1v!ep$QXOBIQrc_!T{1+|}l&}=8$?driz$!=v zynerj2q)Dn*FNYWAC6HFQ`wB2{{%p8RxU3`nM1|-@z2JD!olXP&&7n$3NumruCK&+ zdYqmaO+&1^P|J`C(F+QLgji9qkz>5DRVZ8@itkbNr&Wu0@K&k zLXxu7pg;51Z-}uNhnn?#|385&as0i?k^_2 z{+9e5;|$kzFJGD0FW1B-C`)qOtOH%AgPu<3_py&x-L@Tk9VKf=an zZ3TjnU1$95P*5up`~1SN&Hh`MWe65ti|%_Eka0O8oVgD=9Ds$6+GI}r&$02JvFqpU zpX!qVELpChARyDnjyXLN>6xApJhUE(aG1wUU1WoR*`U(pUCc9elGBz{J(lWYHd1tJ zR9zmTqZJ5A`Vb?{w;R$X17B*j@TRM#n^| zaK`HI8AI3>$?CF77I=aQx19TEzS;Lupkz!|hLv~02L~FY%0j)&LYUNeTDFL#qnfu6kC(&5KJSJV^+uumodKc$Wl!p?%Iy2I6 z?+cyvZGB>99C*L^j;cM3zM=A zu!lVn<5iWQXesi~JQJzpEIS;Z1kCuNU(+}*LSx)x>Y6)EI`(x?t0mq>qRn0sV9~I8 z=N*nW2^*6fZPc-Q|K)uUt4A}zGEKp|A4WpXtT~bMn|%b5G-EB7-~4a^R;NtY;c3zH zKZ%I}(I~cy>$Do!dJ2LFH(9kiulgF$Y8I&iVT^O8fLW6E;1kD=BC~7}N$?^)It7Z# zaQ@SKReSu*El*nPE5jHZ4YWCLC!%{@R5Mnw^&LMbXRr( zOA14nkuYde5My2zx4Nl#l^`o$wiYGLub!~B=188H=WR{M<`|AT{I}Z>%vBF}pep=7 zwg<5kb!%7_CFct=-pt2i%Z@RY-uR`xz7S$PPHHCYl6BhCC#J=fml2YW4(c1D%JPn$ zvR!`=OIn{yilF$GAU;5db($b|gyFevZ$K+KjxY**r+s6};bNzs zc}Pr|$(|nQUpN#b*THpE$oxV@cRmc*DgkX~*meZSYN|@U)<^p-Qlet^aZ+6TeK_%q zEuAW(wZ{x%=YcWTYK*t&5<8s)Vr{ES155{5f3Yx2pO%sx$e%)t33;p$QP-1!tgcW2 zGFx7Eb_D2#)bIOkfLbmX`o8BvVR@nUF_XYwg;{GUfAkJIrUo+^)Fk08>+Us?NGhCqe|0T@u`+^-`Whg4VyM4v>|*06jP_UhXfV1d-E=B7ayK4LK%Uf}A-%ro_!s1c4HN z{f_(P_@ccf{1>Hj(aJEyPBLT}rU&f44a?IlXO;kmiTZ1xosk zE=OyQ{BV9GW4Htx;x-TpW-f?exU?H& z?qkEb*og_oeeJnab}D*yvm+ssBGcEvh6XG8MJ`lb2@OHQhRBELp}Eh93W2rqt6 z$7Hnkll+Sn8CoF;311;DCZkD@WbqXt|KX2oE%mrG3-AS26G4o7*$ z2n(3;QeH5Y%Pm(ao)Lw2!X?J9egiD&Ml=RB`i9K`4&y zA~8D4{OJDxSOuD{O&vObiD0DXWvo93)Jia>v{+ubs*TcElk!D1*3dS^pzffCUj2$} zEJb-UtgHw_b;jDrUx^sb`U&5GSf9{-&~zozKKSqXhot&sC&pCo|NaRqX~JNd#Ju}U zgu?x9y2$T>EGDjgr1+};e;9Ylf}LuhGZuqaBOJD|jSFZ}z*;6@rtJ+%(7MDJ6#e*d zUmpRwHinQrQ-Bwe8B#|Ju%!yh0*ns?cpk&>UkI^ELxkjDmN$QP0!nIwb*zHh=QaNOodK;j zWb@(|?iz`TDn?e;hbp^uPe3aGrf)0~x9tUxjN!7dC@m6VBsyWr`sFDJ>!=3Gru)Q5 zEc?DD6I74 z$HjB`Q^mvT1(6YM*Oh9~>m|s_9!ztCKk{OU)adV7Q z$RnFlwrzfEj8mmI8?&YCA~Ckn@9U^ zUIa=yGw+^LES?2zgW>&5lb>Oh7B$bt_(u`t06iS_vj8iS&e5p*EnWh#+JGtD{nPY& z^qZi`IOCZk9>(#nza7)!sFPEq6W)nw$v~9*!$-dhV%0-uPwdwNn3N|;{RGh&gkDn} z$&V0}a7xGJ<-zv=j4u{{Y4yd|yDMYN%OsI>4@OtbcgR_qO<@aC*I%%SslnDvz}w9 z_q~1rw8Ee>VK`T-GY8bF!6w@>zpDrhlJ_4`ogv7YOm}3MlI{{>gFx>j_)Y#MoMc&p zXjq5^sh^d%TP{l`EY0LHAPuPXBrS1hTkA)qpffOVs#3g_jK*ga;3ZbR1lU_59d_fQ(DswyN>> z9SmTFLuIZ;-t%yfI0|#d9VZ?gBjN_1z0kLV0F3e4Di%dNNisfjYRVdazDF&KL)hbTL_D-Y_wSdAyWY z>?Xx92P{Q?K@;Ib@Ul&M=uU@E2DXGv-R1wd8YHRKIvp%-m=;M8&ULH)4_S0 z4i}Jsb`)aOz{3PJe)qOv{(b*6JiHP=*+mK`Q!umLM+zn-sX;fce2Zs;Sp|&1#Sb2& z1sEeG>@Bq&96l$~$j<|>Pp1G|Bf8K<4?A2zRlec4fkOryYs}z!QvyAP` zb??M1q!;D>!xbw)tcLMX$`td=y8u>MRV*T>tR!feX<9cUvm@6;P)F{zOAKIAXpRb` zW(ttiG&?U_PTFA9KAvWfZ;n=a78N~75QA0=N?N|Qf~9t^F956pwJr6#{XjU^d*yqV z6Qd&k(9ba?+?B&cnSV@>rBqfqf)XxGX;7xJg5u{brQz)tIDcM1PI8qzMQ>zsT_xC< zV3W&BGV2Lj)0^tRpPSh|S6{ROukA>QctCqVV*weIoc- z@kRia8@kRKKe-2C%MFbhD~!)>3St$^#G?b6df&1+m{n$Q=1Bf41X;vnrSG>zM9_tE z|JG002E^)g!WwM#^5kt3M8dhH2f ztQH~m1%v!u4**LhLPXEvWPcD~D*=e!SnvU|*l0D`u+eC{DYjwk%j{L71B6*kV;+n; z;}rqMnv_ROAqO1@LIZ>fq;qEf_s5SmYK^CVlc!7CmG(ghC;S9wOsE-I;dkiz}6GD<= zkEOrTsa_Oh>EIfK@%(xkOSbx)ZvG|2xWUy1NA;J)C@i|nf|dUQu6_SPKp3(%;A%2__=|Sy1oqRr?=iMo=fh zVe?_26`Z+E2WWxJaz<0Z{+eG`TiC6ZfLm2mqkCaqL>PYx%=qH!A8y_* zP62Y@^8IK5N%{;Z)`rVd5*_uI`OBVx#JCE(1$x&9f|6L+xG>@V^el)qqIU62rK~6~ zzX2Fq0^y(A6-OjR=ho0#%2mTxZbZeXppCZ5#*QGDC8wlyAw%;R{c$PB^J*5>OONnP7 zVBmDoSY@Ki#sG{n!yxYU+K7L!=3@I%;TyWe#1h{YeyxuX@9PCiv0nsP^sW=&|HQ!GF6=`I_o_=2gH=mgmlrNU`&3bmG!%y5)+b#CX}SwL=>cGaw|YXdZf@? z@}p%FRh=R{@~JJ#lD3GniT(>AWXCJsHGa_PF$oL@WR5jzD2UY}OWY{$M-aBchJ#o7 z!thEUt5|u9DDg!Cj1lB$%}XPMSS++C;efeZkW~>vOAspQ{!d>V(+Xmpe|B_?nY`%h zZ@&U4*)VH#(kMZY7~cqP*|Lk#^K$_)&e(e+)=d(L@nM1)ZcxSpSrgzT0N$9{ADa$l z!-CGu#S_^}wE@GUehk?n|FS5Pg0X4QV>-VJvP|*6#1z^8rU)R^QDJA#1h6b+?29cV zmJats3=2aW1DO=l){o6$)*md)3Rz*Vs1HsN9p=!;UFOEL=*G5@`TJflD-uWTreejT z6QI?kreQN$p%nsd#8_}Ax7^x*+FO|essI{0%yTjUY(q8%Cn@&0QX5c>jb$>q3{&nF zH(VpH@r6RH>QGh}l=u-Tz~v+sj$hL_yjdfaLeIyEV;yv4@DH$zuvKn&w@pV*+dLI% z=qt7U%$EpTt8wudtHN^s_Nx(MM;DaA0kV`NRtEtxU{+%&CiNy8XGBsczD9JbG5SS~ zImi0v$1zQWL2A9m2gvAZD;OL>K5RqBt<{lo7|{lj>5r7A=PNaf8v0)?7K{GEGz;d7 zuot~ZP}2W`@99zjRt`-?;RIu3N`y@vjWIz$GI)ju_28E&5)7<(bl?+ctnf_01<~*7 zh9AI_!gG+q7-Dt}pe4vd(el3AYaL|PQd#yIen*8ZT3kbX!5@GYjebg1`kOO*<`6a; zx^TUq9f&m_7X#1**BNAmMytV~`?qK;9qe8-^<9z|V=d~! zj$M!H5TljLbq7oG7!PFiz~yq(mNKef+(MewSXjqT^0%Hq=+`) zY`D%I2925C$QwP^I*~a;ng3M~6V!DK+29ArnxC7uh=CJCV*t*ZslU|%l2O4W*D%!m z(wYdCveRIEGGqg2{EnpUb$rlTphfW{uXrC<%&Rgk4-7Y_Uhx5Sw2 zj}i;U`k4`wS(xO%tiM{IRn&0q6c_pYy8&Wzh3AzE=0^xgd93W~e|-SR#;V!+(kbM` zG~kvT`wVI`vk<~$c9N5!J<~9|c%FV!*dp-8SUK<62(bKlpgo*kf0RPhLogdW_9>{W z$PCCDgp%u?i}Bd|qSYDgZxCd8qiw49_bP0W3h@KT@VV%D5NjJ|*Ah&0PzJmZsaR0e zyM_ue9=Wo}2K>+$0gOi$Fyx8~f7E+1))@S3vZe;aV!>kBC_hIe3BY}V3jg%V2o&JO z1kHX56zUYwFaJ1Zl)U=nPyZxBns24IZnq{v_HaX)-*_#Mb$3}zvblk76M;!TDJ{gc zpCQS-gJ~1iE=)$9L}q*za3aM0oD>)tj+cfApkmonXtDMeDr~(WF{m3Ij?4Zn+%lxc z$vpMIZz96DXU6g0{sm%9K>M>YG2Q}}V+#u$20mvnDPfg-AZx6)!L$tz({LLMH7++I zF%D^ypk5QRW4Sh<25?n)ha!MBeM+~IJ6a8}m824lGM#Iqzu`Mh$a2RQHfkN+Ub*6g z18d1ipX7mAg=V>MRpYAcU@o*) zsaf(&YbYnaNt0*&k{GfsCBbPKyEeByaV#0lU0Q?w>;sf^nXJ}vP4fK?iJT%W$qIEh zAvsPpAJbkZ3o{Pn;(>eghXSy4F_#zm^{2)d$z;UEfYZS&Gd5rBkJZ8fw4`OZqB|Xi zSv7O4BI}`|EP`PmwHnmsh;{2?rD%~kv$T_=`-NF4!@Y7?ts4{}Oh|B#Q{nFwl&e2o z@_P780LzmCsJDc5=gmT3<5{~pZCrWbECqQ^jXo(exHg~;XIMq3$`ztaSk|+PyjUZ| zST@lKs#}N0ObW92C<)TdDRqD*%j-pCQPSLho9PwZ}Orf=*926I!o~G~9qtU;Ijl@y|_PMk#a5wReJ9CDCC= zSF$O=pM^lXrCxXl}bX`%rOOHEr41uSv|8~Zk~s}RD% zki1E;tqMw6Y$aOF5@bzY#t5nKcc(dEW|nAFFIWtf)e2X8q-wZOh$W>3RGRMl1X)r+ zLh&a)4PZ5Z9!8!~kWUA`3TUMQM2}B53z*ePHPd6zGuIoMG#D2?RL^Z9hqn;5CIu|^ z(ZZZn)$z*5xM6Ef!3GJiOxPFE7{MOuT%pDz$}l#3;_>L!fR-~COv5#r09g%S&L@ zL9DX0ULiPZk-2H(0Xd}{1H8@K#^E1~T@-^l!@NbLN#o(?P4m*Nf{b6Co*>B<`}rxE zbpDc6UKf<4l?@W%_uGLOGn$34GLy!<}kGv zW;KF*U0>jTPl51km4B^Yj1|=V8qdS_i(If6=JXS7QMy3^&bQ$$pw_E2e=~|Ge;ZPi z@Uk#b4FuFGimbBgsafS@r9d>1-R)Q*#&IE+p-O#+{Q)c%h1UbPfE2K# zG)Z@>6q!NcVj9ixA3-)|cv7P(*}a}}Wz3d0n%NOEWt=I@B3D$}Zt&U^(yc3<+GeLh zW#z)(oW!3ygjf-@xens*imSnRa_nM1^d|nYR?`VbB~2v3=FC~ZN$-n~t_IL}tq&3c zM~3hvQfm(`up>R4C%`r_HF#t2m!t$*Z?GRvfr3JO9s7p_D?M)iu8bP!5Z;b$!YFutLuikT=;U!uslYSup2zmO)!FwB`f_WT^WBr2;L4e5IcvZ$E1sQ0{;5|z|f zVS`laZ}|fvV}q#_H4Fo6rZB4|6hvI8GUY;mjZ_E7>_0~vsbP9CFs#Xe&YD!m7g&Jd zIBBUA?q%N~2@N~a5idc8tR*4#w?Xx(;u?ZlyO<8O zCPfm*)xV^OIoa{&pH3`Gn>JPJRQP`n2D4@eGU^CPX#upl)v=G>%U&Zo%TcEkC?!7^ zVm&duT&3fAB!d5>ge)i8m~Z_E zf+Pc6ueZFHjj8GxFfGL!l}CuBtWdpi;}p_9TWa1;DFhWVR=wX;kQFX#t_${SgD}Pr z>5dd)`J*E*_pKF#;g`vaI4w0Y=j^T&)Fpf%xXg0M=j>3iOlLB zR+t(!=LOK>hT8zr0SC-@l&K(8XDF&68Y~E+XA7|bFuH&vU4Kpruqv|AC`|z@hM9)P zq(C*3UyW}TU_7$zEzth#k(ofo4v}mk37BP$tMuWVum;2;a;sCmz5L=dVknsIegw>T zMCwC@_?d{P$f}@t+u?3PmTpZwqrb)<@i2(h5a%H}m1c%MQecujx6zThP85>x&9s5u z+Mk>fY0aTsqA@7*T`>OO{2Oiuwe z4((J@EA`(>!8pW%T-~$XYaq!Kh!t_U?<~MbxW=k|!v#VtB~yuMHGlHokxWK$$O{26 zKA6Cm{LoLcF%Pg+0gD@Fm%QGc#?_Fg49io5K3Pujm#>L@Arw`GHr*#;Od3HhT`tVZjK@s+QUHv{+$Qrq(O5Oe$qCo+-xp$I zt%k+HuWdsi)p@0#xj7U`Me&LdGd5FChur`z?Ybc1)EH!ZqN}v~ZXHEt7%Gxl#DJ{N z7iK&l^{KTw3rSk5qKMQ7w*l}kS>rzzkeiX1N~?D#Y}sok#B~gR$o`Q;GOpirAYsb} z*;?mWBaQ*Fjz+(hDUX^wph?f*?mH7=K&-$l$Gps-8gB!#ugCaLD{YBV%oPO-x*Fdk z#290)3MV{8$Hi>%lB|KQLzM5%2ep31Y>AH8x_y8xzRdEa75ZM3mWf<-l#TE|39*96 ze1%=N3KCF@iuNR2^ja@MgLE5$d$oSmg)uc50wN4PKMcg$sF=|wfz97i6C-llSg!#a zWQ~OXXBOkRDGi!(uB7p-xS-s`jYz&wVM|(DC1gV^-h^2?$W%xUPo|OZ{>PiKwJ{N_ zf=2n>6lT)OR?4mNt78dSkr)k}M~wF6R{>djNlwG36Q|Pww5&&REdrg!|HGtW;D%JG z(OG)Kxe!~%a#Er63}V2KkP4>_G(zXB4CP8uS+kUtvaDu(LmE#9uj(LE1X+b37FPH@ zuZ~GmAsho#`w{m5B@+x&fF{b&-vk@~GSm*co?>CSyXM$d=^b3Vju`&Ms-R9T5irN9 z@c~SVCa)|sVwF-brsWF)i`j8$KAfA#O<}#C{4`Y7M7rEj<);X+l&VLSmg#n8fQ-NJ zaE`7;w2I8IAOotzU7i6m+aMXK-Kd~-T`EAffm)g0TnTFI>$wOFa_NHsj4ObZmTn&4 zT*XLWqTjuf#@7XgQ~_V4kZ#K867}CH#6l5PLANSKWcP{$UF0_s zlw^vFt)MjQCM+43Xue==rw>4q!r_mUvB}wjANW&5b!4r}XXG1D8}wBE2BE{2c7oK(J_}|9zb({m|_wY*!yM;vphMa4*JDFX6&-&6xAg}#)X81Dqrhk z>Zr-sPOx3Py$@Kzy^dKBUjk&zQV-S&b48YNK zQM^$Cm}7Wof$H>o5VCwUU321J;inu4X6#_Cgj8N*P(l_o!j%6?ky%fs$6*SunK^() zXdV$L%M1}(t%Os75m^DQY09IThr6shZd zn1YyqV0VCW$^W}LGAkt?1`%v^+kjGvQEr%9BT8d%}TS`P=O@Q1X zQ&vWqm{iDqIG|R#y2_v=3P{qJtS4Cte72$*QHfdW779s-l1m6zq>vUU?I~Zn3o5H9 zZIVm<7k2|#OV~|MO%Pwtiy+tCSaH?y18Cd^)v#R)3aBYGzgZ8z5T&(W~L@(H8rKX^QG=Xv50m1>*qa)i^5n3JaXbG3de@uaqwVG-E7Lc%kV*%M8UHE5&II~3eHr99Z z`{k(20)gj81X*^$lu_*vFyl+-XmZAp5GFZb!%|dG>$|6MxrJg^^Sv-*Ri->+eNO>a z8#uN`@bc#gv6S?pp!RE12ShH|igLce5_DCH(Y;ELB@@h|Vuv9AuSRC+)7?-u_`4L* zh`72F-fP)pZ=hrwsm;MN`w(V9MZ_jleH0-ZcT)YLEs~n&kW)de7IfmN1Iqsga(4vZ zTAEw}rDZs#h$}iwEo~rk5?<{OPtz+h<6D;c;{+P_ELaks0+O`9ycMcJ&Pb`~h?q$D zAwn!mNy;+Pcq1iZpP}0T$DbL?h473+ksuguSrSou2a>ICy$`5mivcPPj&=WbqBQ1M zfpvJWy^w^tU<^y=yg-<-!qgg`fm@J993!XIyg*VKlPbtc2KKv^$D~H^U_zKt`b+?` zDpyhnH*}W(CPgh8tL=wD)?h)Bx0^}*7262eVKQrxiJ;gyux;>%2(kV-h9_jQyf7SN z(anPI)p-+REL?f3+3%kMLVsa1OV8{!Ev7NNUiL-VJ7WY?K?S@<77*iw85F|;j$%Y) zg-a9=fJFk0j>E-bIRprh6;4N{H9;izBhuJr_$lk+09tbt$nSl+xMPKi(E2!)(g3xJrm+!6aL) zcb`8^iL${ZjQ=7+Jz)T?j_HZ4QM!uOHc9D@H6j9`F~p_f zAo;590&G<>rXcLn8^li1&fJNr^Al1ayxZ!pP8nv*1Wna%f{YC;MkL)zEq3;=F{x2S zQbPqG;WjxxqF@2F(rPrZ!GYfZTCK=ql$x&%gzvMUARMe5k}eXgVyk_CtVBo>_?_@W zQ#N$BsM;5$vBJ{I`a4<>gH?BnvETfgkZ~k}Qay>_|LyjVd2y!C9?D;|8Ia{w!hA$! z6$nWtI~`wWnk*D%Oj5ov@@6nxkhMl)a2KZ8qLflQ2dQ971zB@&5=I@?2uSkOF~w*< zR!GwSwL#Nv<*or>Rstj-oZsp-?EvQb081!7!L=0KEm})aE`f+WS4gf8Xe04R3UC=3 zE*1;0!Cz9(b?~PZHXc|}>FP}UC3}Mz51b2Y3qjI7PY28${hRBpaI-Yv)-|{gN7<3K z>y0|8It)g1L3wK>VB8|L>H(&J7?F0dyfN;#6_K$M)-@HgR~iwMcidMRV#Um2;fvQ- zkr)$lGfOYlzzb;X4U+4ag!`m9$k-&fS0B(O2YK))@Mj9KYC_Dc^0Uq$oa+i`%js*U zofjd5uq;Yg|H`Nc>Gm#8lnk;0)v*6X3?1DTLmI~22D~m;RHG}Fk&UcpUQ02FDx6Yd z*Cx!$q}5Q)&gu;`?wHnsf#KVtO9nPZ`?^y=kNZSut{5tQq5o2lHA~j+3jCN7Aq=9d z#BWtq%$5FKOAS-n2byDI^1rS70s%7a*q7)z!W?Kh@Rq9lkvyoFh9LjxM%hDYTHIEm z_(lHN6r%LVt7H5NDa7#B3yHq_bup;|d;*bp%Ulqv$r0g702LH48$j%*@gPl?Ml1=i zRfpX3uqw5Ms@OG1z4(R_G;V|AfqMUmkYt$QrwE7b^8hR%J6tUFTP=)is6EH1C-3wU zSkfW&?z*HZ1C2L)JFs5_X4VR{Rtz;1X7+V{7sWSDIBSzpWYBU{;(9{g*>uF z8Wj|-_o2fc{T6{-{bRk43HjVkw8!L;QyVOCDvq0x!u zrC+2FhZDNlclv+Q3^<E`Sc6^1Z5CP29B__GFO{3yQ zI@To7jT2~eQYy+Xcz{gn5?sN{-*M2oOct$G3}>j^#PXfngIM3es{xziFFHg(gQ3n3 z=m=m{S5(jHR9T1rw;jQf*%t#PU6l;8Z@`Tg?&fg%TVkXJQGJz_>}~>;6$2SUeV+~% zz@%GqF|DxLH!G8*V7$&NZT1vF3I7aK1dnS|1a5W9>JA}EiLmg)7GNiU*!J{%rrkBW z$AqxW)YXvh_60GfWDtdkmj>#<7?tS_Sph9oz>HA)HNCQ0)|OC~!eJ8^2yM;_-nA$J zYkiyO!F+MJuIsj@`6ODs8pEut)dl6XWb(SGtYmCjD8*YTfck_U_oV>iEqQj7-gSCG z1kp;;z#{shn=TZoUh4pR8FyE*NwooG5^q@_;?^RP?rEmWO2NV?T zS6IKP=Ly(?y$Y*}hM|B%q$?k`|9}Alw#sZjx$odZS6^}DkcQ{p-)rlpXS!~(QAK&p zu!<3*hHtvz>8|dPcFs+3`mZ6w*Ye+XZb=8{uG*2mKj-hmoom$J-x@wme;?*t>yysi zzOieV#dkN~_+CWr2`%3-y1jINx08n)y9^NS-_F#5{M*Ca&R#l0280 z2n(5v%e%_CcFoRpnBiReY0l-}=3K{{o!j_c=Qf(jom2t9DY<+SGaB?SJbbY%Qkd%#VfnH5$n3S(yGp`WI$&(YF%eHa%E>% zeqt9_wrv+z*?m)2QP#zsL^-NDZ|17!ZRSRQyP2!)*WJ~e+TGQ?*~5+5yt}J^a|<{2 zm+o#jd0g_#7Vc7htNE_DJmZ=>yM}=c?c8UbT*EP2Id}9k&K-B6bH`rf+zHoqbjMG~ zxRd&IbSIW&+$jg;yOY=DyVI)j-KodsyFu&PyVG0RyZfluGj{Lb&c1UKcUJcfZm`?L zopZ(}?%X#wa{uVw$(?uNMsCQGjogGD&i(VSja&oeZ@kU956N?1_!wW>&W$^+oon2` zoonE0D$jG12IslPgK3wdc5Z8UoRVqpn%~WHlfTPz*KF+E{lwiJd@6tM!*BE6d2Ski zx2$yTe5J|v{MN2v5Ovc~L|R=)^Kj?J_sVlE-P^fV$~CS(^fh^Ic4J5P8ng|I;DPTQ z{%+*o=Fp}e@^{Nud9L-Mc5X0f&7lyOT5-w%(Ii1V4-&3$@VU$$6W3%mMf^9~+Km1lYcf4gc2kSq4T3 zccIMn&eg+HBfkwZGOp#IjBDLIz1xZKZqPL?@8}+ek7>kv zlHc9HtD!lR-z)j|Yt+^oI=Zg>HoV)>H9p%h)JJRk4sP6;l(9D7H7o#M+R;tgKi@U= z&vz3BIya3p<}&V%A)U!z=ey?Ce0L+*HP7a|spNGVe}6|`nme?kdyqakoAAASvj=u` zrx53Sz6SCHM)CU`JhuE!zt}y`y~y9Q8RM_;JM}c@788Fi{p1OL7aiWw zHIeS58P3h?1y9Y+JqteWUfSke=N4r0T`S>f^v!WMXWVO~(b~BKeWZhH1Z$d@ag z+@<9C8uhRUUZ>JGj)kX_`Q8C*SWo|eZd_x=jlV5J9vSyCX->K~Wi!S z`+<$=@BFrW#lQD!=VtP6vnlt44%8!mf5E>!%YRK7`x1+ zP4tC^!PM<}&izKb@sw{W{ootouHk!&bQ&**=3>Uv_N4J3C7eEKs_|}a&8fSPu|11nUrDf3^3AeApi0F z&R$O#o)$DZ_b2fdZJg(tsfP)NlRx8d0_~+Wt6^i!b8=JMs6lX6R1s z=vv#;->dko;rFO~H*=3}u4Nv5XMVn$L|Zlu?nZy_<~q}c<1(Gyc)|^|T_bbHT==?% zHlF&Ob2IpR4Q03zz9yG z;`<+QHiO3r^{j3DHl9Y`nZ^7AKKn2DJBW5+o!v?QMt!ti){ef^#r5UiFChJS%e%Rz zgPr?;x^JG<&2pgtC>e#rkT@_eK-^KNH%Pb+QuqH||Mdrf0EH?_H&)41K2c*lSp$?u}& z#3kMH37^8(L^}=Vw+22A=HF*`fR_!l$-F!_N;F_oPokZFWPB061iItE)DOlJzLc+J zKK<+!=RT!OO{LDQ;kR)aV~~3LkFcc~cP4SB&9VM8n>gnZo(v!N^Y_eY&J88}HMAQ0 z@ACI@zUTSg;2VD&X^}=FU&EY?JBBuzbTNGMZxi6{O7Gkh%F#?+Plomy_%G$(mhnv` zkGag*_nee*CGh?rJk36jwc%d+BwwRG%F@8M;Npy{fM$-;y^4AypHui|Q{Th+J)dtB zUt>A+e2Y3{+}-4PDA<*hqmp>@$ZsZpPv>JyyOsyxo3Y%$H@-E`Jq-Q?-}8JePcl!i zPB$|jv}~)sjC}ASZOXW5IgGD_zmIL_#-HZgYtT2XqV4t|Z_3z6KN?3~wdDCB|Mm{w z8l_2}oJ@U8{>*rkjL|ZIbk4}Q*~jI%2?sN$LHDz0Kcd}EZ0D-s|6A(*QqsDTzZXyk zD&wEfG=j~3i?#;8l&@uSd)HV?+I$oAZ;MIavF@MK&gId6r+`ghoLtLqC&HWYwY=HY zwd_uLTnE>BK?nB(dHuxKa#L5$a7pT>aU*lyJtRgA@dpisi{BpH!a_-hrcPM^rclD-DG~7*CTrp=Ni`T zsjK)%?@wsYf29ge+#_=2EF^+WJ=XW*V>>0=h6Z4&9f|hG(_fI>xMPI`^ z^*n@hFXYSejpWPl%_+)vUlOlnNuHZGIN$xi-&Nqh@te0S5{Cf}LT@U?&GpY9#^yA+%Zr(ul82npqJU4!q z=Wc<9ZA8OVcw0xmxre_SUu66<*5~v0IQ||)oC(YGLLZq#Uc(5hj>nV7x%}N!;9N1k zm3-U4x8~~B`6eG|o$gLLoAGVIHU$p{avr?i}ad3C5$yt<^7vJ0eY>q|{V)3$um=`6 z_YrY#KM*^cfP((29kKD5*N zXJDSVt-al9!heAO!0(qz=LP8DwUIh+SmoS~{97MBtv%z9qtEiIHE7b%jQfqcn!xW5 z{I;^EY*|Nt$!zPI>oYE&dGeaUtT6={_dou<@#F1WqwnqRAdkkOz1`Ht-mYn2Z^}=* zm9RFP*4s7C>FxTF*Z6z+cW9@+wVm6IaMR-6tWEs;&3x3;_+^AA@^^D@_Z#U+&bpm4 zH}miRBdj%bW6GD$+}+TH_WFx`Jb%w#)!WUk-_FgZ?Yi;r3-<5r<`!({=91st#Ge4| zef-V_-;;b7kp6^=Y3m(&yG4g@=N6IYP5k?pl*beQalV#EXzvHNb!USwqCDsEdk1)L z%D*MwUVMG|8kSOizHvKHkH~BjsFwr5Cp9yc=o6C}!_8l3+-lOk@-OP`3+8$F=?2X; z9}|Z02yKJDS^UlSU-D{4o~nZ_DP!}DjGNiWzqJyPPr8=Yb&QKI&_!r1`;Kut zNAn`%^8)taz0gmP#=H&A_2u7pb-?NPp@E#ys+U(^7E$K8$!RS@Z;q z`>D`YD(+j1rD^>8#~t0Y_0YTauJv2yg(AvBU7b#xI_NGZy%QCGE9&xK#w6Gkd@UD{ zRv+i~raiU(O6H$^aGu+b@PT}Dp_zLg>7pZ;%vhRzW}aIJb`fcfFYn^!-sapr3&8nZ z)CD@$$Cdos+{NI0Ey|Pmqw(E*_mckR-{0o<1gd`ozYCh3E91AJ6&l*HkcV24ht4J4X2w8chmLL#e;4x& zrw68W83DrvBYg+Z@n7)eZHNj|JKRsOYA#7?hwXRPu26M?cA6A`()~* z@ichhJBPSGfc=x-X$R-KL!g`dV!oS4cnUJhZ~WU#_;30m-_^l$BkOkq-{H`W+kpN9 zeSl=(26PDO3zI(U=>A3A3G~Hlpr68;f91`{5B02fw=vIBch{VU>`?%a>g?RZx8=Eqn)BSF&}ctU242bM$>Vd<`;zY<{;hc; zW9{>N_w=khw-Nb$pz=_ut)F+M?{;?016gYZv+to#OyQfj7`dLWX$CsL#yr;^-t+l3 z;k#*f^tQCeJ?zg~r_%T5b#xO;nJ>Zi=Ht(XmUVe9pWprYR*=`C8P4rS+=uyni0@GT zK7#LfzJYxE@zp|m5B&DwcP9Mrv;%s!!Flc^{;fBEZ^Ku-J#|s$-1S9W+;y&Ok-4H8>|yr74^8am7A?=X2hklo#@_f* z`p#m$NBA0xn1lGn(-)U$U(IAZfqu~N8To$P&0R_w!}(fXp`XxkCo(5a^sE__@kqXw zuX?)HM|!%uhi2TVl>e^N+Oc2m=I$JvakGd&jyAoRIy!>yXU1G5zkl+33BSMb`w0I& zy$k(=zyHTK;oZ(|;@4f>^)yb?$6ehMU^jD)@I1e-@jb?O4Ea9I?;SPh!uXxG6&YW} zUa7Gw@_$!1V=8^3xvRVJSk@Hk;oc<<kL$|5 zrmOn_d=7h`i3QZfy3O5Ah#X5_KxfCGZe`CH_EXQ&N5G%HwnM1rMc>kq*ONZ@T5t{F`VFOwxIn@R9nPzA+Bk ziTgY9Bi?7|?D)6Yd?!$+%Cnf?@$eMZrT+BKb<8CXX53lS*>L`C7~j46oAgHUH86KK zl2nYvm^T=E#t{4sqFe=i`7 zcS++me(zjvaI?bBLI=tI|&M)!@;r*7d|hID10Prul_ z3-kOY^bhn{Y>Zky-I9;+L7iOdFB^sabv`^aoXMKX_vQBRbuImew)%m;TUL_Jx5(te z9XNTma<0^hPNDT2(k~(JGUQACJ^aXfr%|bU8y34>8(3klp z7SV>c@%NcveAj=*yo9W;xncT??Bj|54QWo^!TRIR${!g_XEd#kIQl*OA~W1U-AvpV zeKfy+LX*e0hOZOfW_;W5b>qwDdzd=glHcBZElU_L$R1iyrE^jL-wFKxNW1sos;+y% z^Gh!<#mh9NF~PDzacM$h8q=7@Gzj9s45kS~XhIX3(8NPr*h3h?5QfkM^AeJM2^SMg z2*F%TWC=+}(vdhidL8MUFoYr=OcRDsgyJ$-CDYi28HFMYp@__Uwy=HEeQ#I)F@JpP z_gic4v-Vzluiskhw;uaMY3)=FdOJ5BJr`~NHVs^q@5nD6D1PS>W3A*v=X)qU`P>)T zyLVIci7_gA@pb-bblkg)%5Q0OJU@i_;$o5R`7Vx*FLHeKqwDXR<-I#MvaK189dKTc z{Ym%8=f9sT{@CZgUl{%V6VLCqvMarK6d&C`mO3^wI=RB^+A8nhmnOX7{yC zyS{a|@UJ~1_Pld}^X5eT7Ufml^2PYV*4L(oZI~~;xj6g$wD7^VriE?ir-glor-u(- za&Ght)$I!%f4gOR_zzLOkNO?9=PY*k9&j?HD^Re^P4E-|4AIBe~cEEd97S6V5=Z*D$@L|;6vzJ#% zbFq=He)dP=jrpH7_W!}hGb8NV>)7THo^kHm?Eiz`dzZ$2);VY2 zBKH=RQ}>thPIril&Phn4r`|vM=-#7pT;%9HCZ$Iz1mz{GKqv)PNWUpr& zZ$bvAv9DhFm&Q4IkDU$q{QPmwFAQNzbiYwKkzUmP?bt^DZDE-DRrdSU$bQw8`t=8# zH%UH@kZ&3X>5S5oM%1qK~J5x7Rh_Qr7leof>|cl^gcE@3;3)4R;*>nS4cc z$v$~K=iCS4BKy5WfBPgy|5V$;-kYypbIS(a(N3 zU0GM=+0FkhUR}C%w)h>`DxYV6=lDm{gRYzT0ebUv{WkppeT403y$s7=11jw zdUW2$p6j$3;SKqV+Mhk*-tatLAU7i_zlX@EemhDQcd%jkpBEi-AIBoeM&Izx-Wa1? zsecwmab$F#HT0e1_$2STpYOY$i|$AMw`b{N=(BwAJ@@iKcKA1+r}sfW_wyKA9VD%H z9Ix}c2KCRc$zPFMALT3I{Ah0CgP*G>zA65z;-hQyi|P&h2)XjLB!p8v_v5+!IxBpW zeg@~G-#_8^kFn9;xc}(Ai__iQ8uc};zUdhQE|#yY`TWMS@~2FEFioFplC<=Vi}mk{ zqw~}WKOv93m=|6pcPYbfAZkb680C4r;&(rguOGVJvn0Rte|Fwa5w%0FkRKRpx2(mr z-H*Dc*zY1gZGgDqqG!YZ>0NI%E>PUvJN#{Qp0?->HuD~REh4=tihoJ^Y~

u}&# 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

d3k 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 ze&w$Dvj5BeFZ;jjSMr)K`@ih}vj59|Wv}_N|I7X_`@ih}vj5BeFZ=ob;s1yKAO3&% z|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO7Drbv^s}|Kb0K{~!K;`2XSm zhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y z;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K; z`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{ z{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K z{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665 z|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&% z|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe` zfB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yK zAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSm zhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y z;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K; z`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{ z{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K z{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665 z|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&% z|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe` zfB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yK zAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSm zhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y z;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K; z`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{ z{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K z{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665 z|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&% z|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe` zfB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yK zAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSm zhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y z;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K; z`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{ z{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K z{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665 z|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&% z|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe` zfB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yK zAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSm zhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y z;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K; z`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{ z{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K z{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665 z|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&% z|Kb0K{~!K;`2XSmhyNe`fB665|A+q{{(t!Y;s1yKAO3&%|Kb0K{~!K;`2XSmhyNe` zfB665|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|ND>q{D1s^{D1s^{D1$kpZ|~lkN=PV zkN=PVkN=PVkN=PVkN=PVkN=PVkN=PVkN=PVkN=PVkN=PVkN=PVkN@w#_VfSo|MCCv z|MCC**M9y#{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd z{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd z{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd z{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd z{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd z{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd z{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd z{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd z{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd z{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd z{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd z{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd z{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd z{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd z{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd z{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd z{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Y|1N#r`Kd}G6{sa3D z>_4#o!2SdK59~j%|G@qO`w#3tu>ZjR1N#r`Kd}G6{sa3D>_4#o!2SdK59~j%|G@qO z`w#3tu>Zh*{y+Xd{y+Xd{y+Xd{y+Y|1N#r`Kd}G6e*QoHzXSUZ>_4#o!2SdK59~j% z|G@qO`w#3tu>ZjR1N#r`Kd}G6{sa3D?C1aE|KtDT|KtDT|KtDT|2wq*(EdaF5AEmw z_4*q$o?bykL*9P|Hyv+KmI@dza#sP>_4*q$bSAm{y+Xd z{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd z{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd z{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{y+Xd{=Z}U zkL^FU|JeRx`;YBEw*T1vWBZTo=l|pXJGTGW{$u-(?dSjF|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT z|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT|KtDT 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 zAT@y008#@;4Inju)BsWgNDUx0fYbm|14s=ZHGtFrQUgd0AT@y008#@;4Inju)BsWg zNDUx0fYbm|14s=ZHGtFrQUgd0AT@y008#@;4Inju)BsWgNDUx0fYbm|14s=ZHGtFr zQUgd0AT@y008#@;4Inju)BsWgNDUx0fYbm|14s=ZHGtFrQUgd0AT@y008#@;4Inju z)BsWgNDUx0fYbm|14s=ZHGtFrQUgd0AT@y008#@;4Inju)BsWgNDUx0fYbm|14s=Z zHGtFrQUgd0AT@y008#@;4Inju)BsWgNDUx0fYbm|14s=ZHGtFrQUgd0AT@y008#@; z4Inju)BsWgNDUx0fYbm|14s=ZHGtFrQUgd0AT@y008#@;4Inju)BsWgNDUx0fYbm| z14s=ZHGtFrQUgd0AT@y008#@;4Inju)BsWgNDUx0fYbm|14s=ZHGtFrQUgd0AT@y0 z08#@;4Inju)BsWgNDUx0fYbm|14s=ZHGtFrQUgd0AT@y008#@;4Inju)BsWgNDUx0 zfYbm|14s=ZHGtFrQUgd0AT@y008#@;4Inju)BsWgNDUx0fYbm|14s=ZHGtFrQUgd0 zAT@y008#@;4Inju)BsWgNDUx0fYbm|14s=ZHGtFrQUgd0AT@y008#@;4Inju)BsWg zNDUx0fYbm|14s=ZHGtFrQUgd0AT@y008#@;4Inju)BsWgNDUx0fYbm|14s=ZHGtFr zQUgd0AT@y008#@;4Inju)BsWgNDUx0fYbm|14s=ZHGtFrQUgd0AT@y008#@;4Inju z)BsWgNDUx0fYbm|14s=ZHGtFrQUgd0AT@y008#@;4Inju)BsWgNDUx0fYbm|14s=Z zHGtFrQUgd0AT@y008#@;4Inju)BsWgNDUx0fYbm|14s=ZHGtFrQUgd0AT@y008#@; z4Inju)BsWgNDUx0fYbm|14s=ZHGtFrQUgd0AT@y008#@;4Inju)BsWgNDUx0fYbm| z14s=ZHGtFrQUgd0AT@y008#@;4Inju)BsWgNDUx0fYbm|14s=ZHGtFrQUgd0AT@y0 z08#@;4Inju)BsWgNDUx0fYbm|14s=ZHGtFrQUgd0AT@y008#@;4Inju)BsWgNDUx0 zfYbm|14s=ZHGtFrQUgd0AT@y008#@;4Inju)BsWgNDUx0fYbm|14s=ZHGtFrQUgd0 zAT@y008#@;4Inju)BsWgNDUx0fYbm|14s=ZHGtFrQUgd0AT@y008#@;4Inju)BsWg zNDUx0fYbm|14s=ZHGtFrQUgd0AT@y008#@;4Inju)BsWgNDUx0fYbm|14s=ZHGtFr zQUgd0AT@y008#@;4Inju)BsWgNDUx0fYbm|14s=ZHGtFrQUgd0AT@y008#@;4Inju z)BsWgNDUx0fYbm|14s=ZHGtFrQUgd0AT@y008#@;4Inju)BsWgNDUx0fYbm|14s=Z zHGtFrQUgd0VATLt4Pey(Rt;d)09FlP)c{rvVATLt4Pey(Rt;d)09FlP)c{rvVATLt z4Pey(Rt;d)09FlP)c{rvVATLt4Pey(Rt;d)09FlP)c{rvVATLt4Pey(Rt;d)09FlP z)c{rvVATLt4Pey(Rt;d)09FlP)c{rvVATLt4Pey(Rt;d)09FlP)c{rvVATLt4Pey( zRt;d)09FlP)c{rvVATLt4Pey(Rt;d)09FlP)c{rvVATLt4Pey(Rt;d)09FlP)c{rv zVATLt4Pey(Rt;d)09FlP)c{rvVATLt4Pey(Rt;d)09FlP)c{rvVATLt4Pey(Rt;d) z09FlP)c{rvVATLt4Pey(Rt;d)09FlP)c{rvVATLt4Pey(Rt;d)09FlP)c{rvVATLt z4Pey(Rt;d)09FlP)c{rvVATLt4Pey(Rt;d)09FlP)c{rvVATLt4Pey(Rt;d)09FlP z)c{rvVATLt4Pey(Rt;d)09FlP)c{rvVATLt4Pey(Rt;d)09FlP)c{rvVATLt4Pey( zRt;d)09FlP)c{rvVATNjKlZButQx?o0jwIpssXGTz^VbP8o;UntQx?o0jwIpssXGT zz^VbP8o;UntQx?o0jwIpssXGTz^VbP8o;UntQx?o0jwIpssXGTz^Vc4f9+QTST%rE z16VbHRRdTxfK>xnHGowEST%rE16VbHRRdTxfK>xnHGowEST%rE16VbHRRdTxfK>xn zHGowEST%rE16VbHRRdTxfK>xnHGowEST%rE16VbHRRdTxfK>xnHGowEST%rE16VbH zRRdTxfK>xnHGowEST%rE16VbHRRdTxfK>xnHGowEST%rE16VbHRRdTxfK>xnHGowE zST%rE16VbHRRdTxfK>xnHGowEST%rE16VbHRRdTxfK>xnHGowEST%rE16VbHRRdTx zfK>xnHGowEST%rE16VbHRRdTxfK>xnHGowEST%rE16VbHRRdTxfK>xnHGowEST%rE z16VbHRRdTxfK>xnHGowEST%rE16VbHRRdTxfK>xnHGowEST%rE16VbHRRdTxfK>xn zHGowEST%rE16VbHRRdTxfK>xnHGowEST%rE16VbHRRdTxfK>xnHGowEST%rE16VbH zRRdTxfK>xnHGowEST%rE16VbHRRdTxfK>xnHGowEST%rE16VbHRRdTxfK>xnHGowE zST%rE16VbHRRdTxfK>xnHGowEST%rE16VbHRRdTxfK>xnHGowEST%rE16VbHRRdTx zfK>xnHGowEST%rE16VbHRRdTxfK>xnHGowEST%rE16VbHRRdTxfK>xnHGowEST%rE z16VbHRRdTxfK>xnHGowEST%rE16VbHRRdTxfK>xnHGowEST%rE16VbHRRdTxfK>xn zHGowEST%rE16VbHRRdTxfK>xnHGowEST%rE16VbHRRdTxfK>xnHGowEST%rE16VbH zRRdTxfK>xnHGowEST%rE16VbHRRdTxfK>xnHGowEST%rE16VbHRRdTxfK>xnHGowE zST%rE16VbHRRdTxfK>xnHGowEST%rE16VbHRRdTxfK>xnHGowEST%rE16VbHRRdTx zfK>xnHGowEST%rE16VbHRRdTxfK>xnHGowEST%rE16VbHRRdTxfK>xnHGowEST%rE z16VbHRRdTxfK>xnHGowEST%rE16VbHRRdTxfK>xnHGowEST%rE16VbHRRdTxfK>xn zHGowEST%rE16VbHRRdTxfK>xnHGowEST%rE16VbHRRdTxfK>xnHGowEST%rE16VbH zRRdTxfK>xnHGowEST%rE16VbHRRdTxfK>xnHGowEST%rE16VbHRRdTxfK>xnHGowE zST%rE16VbHRRdTxfK>xnHGowEST%rE16VbHRRdTxfK>xnHGowEST%rE16VbHRRdTx zfK>xnHGowEST%rE16VbHRRdTxfK>xnHGowEST%rE16VbHRRdTxfK>xnHGowEST%rE z16VbHRRdTxfK>xnHGowEST%rE16VbHRRdTxfK>xnHGowEST%rE16VbHRRdTxfK>xn zHGowEST%rE16VbHRRdTxfK>xnHGowEST%rE16VbHRRdTxfK>xnHGowEST%rE16VbH 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 literal 0 HcmV?d00001 diff --git a/modules/audio/asr/u2_conformer_librispeech/assets/data/bpe_unigram_5000.vocab b/modules/audio/asr/u2_conformer_librispeech/assets/data/bpe_unigram_5000.vocab new file mode 100644 index 00000000..7e0ff98c --- /dev/null +++ b/modules/audio/asr/u2_conformer_librispeech/assets/data/bpe_unigram_5000.vocab @@ -0,0 +1,5000 @@ + 0 + 0 + 0 +▁the -2.9911 +s -3.44691 +▁and -3.58286 +▁of -3.70894 +▁to -3.78001 +▁a -3.89871 +▁in -4.20996 +▁i -4.36145 +▁he -4.48281 +▁that -4.55289 +ed -4.59016 +▁was -4.59181 +▁it -4.62484 +' -4.81583 +▁his -4.84177 +ing -4.88039 +▁you -4.99998 +▁with -5.00838 +▁for -5.02039 +t -5.0555 +▁had -5.07751 +▁as -5.09744 +▁her -5.13191 +▁be -5.19505 +▁is -5.19882 +▁but -5.21324 +▁not -5.22608 +▁she -5.23394 +d -5.27841 +▁at -5.34023 +▁on -5.34498 +ly -5.40443 +▁him -5.50709 +▁they -5.56045 +▁all -5.58704 +▁have -5.59768 +▁by -5.60002 +▁ -5.60186 +▁so -5.61262 +e -5.61903 +▁this -5.62164 +▁my -5.64057 +▁which -5.64669 +▁me -5.69076 +▁said -5.70437 +▁from -5.70664 +▁one -5.7513 +▁were -5.78541 +▁we -5.82874 +y -5.85619 +▁no -5.88631 +▁there -5.90758 +n -5.91704 +er -5.92896 +▁or -5.93481 +▁an -5.95345 +▁when -5.96716 +▁are -6.01743 +▁their -6.0437 +▁would -6.05331 +▁if -6.06359 +▁what -6.0895 +▁them -6.08963 +▁who -6.10441 +▁do -6.134 +▁out -6.14848 +▁will -6.16929 +▁up -6.18755 +m -6.19966 +▁been -6.20889 +▁man -6.28662 +▁then -6.31167 +▁could -6.37658 +r -6.38978 +p -6.401 +▁more -6.40231 +▁into -6.4095 +▁now -6.45621 +es -6.45723 +▁very -6.46767 +▁your -6.47768 +c -6.49829 +▁some -6.5032 +▁little -6.52174 +▁time -6.53362 +▁can -6.57863 +▁like -6.58001 +ll -6.58456 +re -6.59459 +▁about -6.6011 +▁has -6.63724 +▁than -6.64773 +▁did -6.64974 +▁upon -6.66755 +l -6.67708 +▁over -6.6829 +▁any -6.69691 +in -6.70055 +▁well -6.70679 +▁only -6.70884 +▁see -6.72382 +▁good -6.7302 +▁other -6.73256 +▁two -6.73281 +al -6.76971 +▁know -6.77014 +b -6.77332 +▁go -6.78028 +▁down -6.78382 +▁before -6.79386 +a -6.80864 +▁our -6.81482 +▁old -6.82309 +▁should -6.82836 +▁made -6.82895 +▁after -6.84628 +▁great -6.85243 +▁day -6.85544 +▁must -6.87627 +▁come -6.87777 +▁how -6.87869 +▁such -6.88362 +▁came -6.88807 +▁where -6.89779 +▁us -6.90031 +▁never -6.92945 +le -6.93511 +▁these -6.95338 +▁much -6.95525 +▁mister -6.96536 +▁de -6.975 +or -6.98345 +▁may -6.98676 +▁long -7.01388 +▁way -7.01809 +▁first -7.04141 +▁back -7.05466 +▁own -7.05634 +▁am -7.05808 +▁again -7.06591 +▁say -7.07176 +▁men -7.07357 +▁went -7.07513 +▁himself -7.07891 +▁here -7.09085 +ion -7.10388 +▁think -7.10393 +ness -7.10433 +en -7.11572 +▁even -7.12414 +g -7.12655 +▁thought -7.12694 +▁hand -7.1271 +u -7.13322 +▁just -7.13401 +ve -7.14094 +▁its -7.15029 +o -7.16142 +▁un -7.16965 +▁re -7.1721 +▁make -7.17463 +▁might -7.1793 +ation -7.18013 +▁too -7.18635 +on -7.1907 +▁away -7.19477 +st -7.19708 +▁life -7.20558 +▁without -7.21952 +▁o -7.22087 +▁through -7.22747 +▁most -7.22784 +ic -7.22971 +▁take -7.23593 +▁don -7.23927 +▁every -7.24535 +th -7.25167 +▁shall -7.25978 +▁those -7.26214 +▁eyes -7.27376 +▁still -7.28725 +▁last -7.29948 +▁house -7.30575 +▁head -7.3073 +▁nothing -7.31319 +▁night -7.3151 +able -7.32761 +▁off -7.33689 +ity -7.33883 +▁let -7.33975 +▁many -7.34144 +ar -7.34535 +▁being -7.34757 +▁found -7.34819 +▁while -7.35326 +i -7.36804 +▁saw -7.37042 +▁get -7.37494 +an -7.37662 +▁people -7.38318 +▁face -7.38748 +▁young -7.39215 +▁under -7.40057 +▁once -7.40078 +▁tell -7.40791 +▁three -7.413 +▁place -7.41377 +▁room -7.41704 +li -7.42158 +▁yet -7.42442 +▁same -7.42976 +ri -7.42985 +v -7.4311 +▁father -7.44096 +▁though -7.45043 +k -7.45091 +▁another -7.45131 +▁right -7.46533 +▁heart -7.46662 +▁put -7.48293 +▁took -7.48368 +▁give -7.48808 +▁ever -7.4903 +▁work -7.50099 +el -7.50309 +it -7.50743 +▁e -7.51169 +▁look -7.51181 +ry -7.5122 +▁new -7.51353 +il -7.51571 +ers -7.51791 +▁part -7.52099 +▁king -7.52387 +▁missus -7.52455 +▁sir -7.53014 +▁mind -7.5303 +▁looked -7.53104 +us -7.53328 +▁love -7.53458 +ra -7.53906 +▁asked -7.53965 +▁left -7.54703 +▁light -7.56075 +▁moment -7.57071 +ro -7.57073 +et -7.5746 +ive -7.57948 +▁world -7.58543 +▁things -7.58651 +▁home -7.58975 +▁thing -7.6002 +f -7.60068 +h -7.60196 +ful -7.60292 +▁why -7.60735 +▁mother -7.61051 +▁always -7.61115 +▁far -7.61265 +▁water -7.61901 +▁s -7.61926 +la -7.62405 +ce -7.62873 +ck -7.62955 +▁heard -7.63327 +▁something -7.63489 +w -7.63624 +▁seemed -7.63649 +ch -7.64796 +▁because -7.65167 +▁end -7.65457 +▁told -7.66091 +▁yes -7.66365 +▁door -7.6662 +ted -7.6708 +▁going -7.67276 +▁got -7.67607 +is -7.68689 +ter -7.68801 +▁woman -7.68896 +▁god -7.68943 +ol -7.69186 +est -7.69247 +ent -7.69838 +ur -7.70382 +te -7.70972 +ling -7.71225 +▁find -7.71593 +▁knew -7.72124 +ne -7.72399 +▁soon -7.72471 +▁each -7.72548 +▁side -7.72953 +▁oh -7.73896 +ul -7.74838 +▁against -7.75871 +▁name -7.77125 +▁miss -7.77191 +▁quite -7.77406 +▁con -7.77659 +▁ma -7.7812 +▁want -7.78461 +▁years -7.78825 +▁few -7.78901 +▁better -7.79308 +▁half -7.79628 +ton -7.79945 +▁done -7.80176 +ment -7.81027 +▁also -7.81536 +se -7.81952 +▁began -7.82133 +▁having -7.82983 +▁enough -7.83157 +▁lady -7.84016 +▁whole -7.84092 +▁both -7.8452 +▁seen -7.84696 +led -7.85123 +▁set -7.8565 +▁white -7.85755 +▁course -7.86189 +tion -7.86283 +▁voice -7.86482 +ir -7.865 +▁called -7.86562 +ma -7.88043 +lo -7.88068 +▁turned -7.88486 +▁gave -7.88561 +man -7.89007 +▁poor -7.89153 +▁dear -7.89597 +▁girl -7.89892 +▁morning -7.90137 +less -7.90146 +▁between -7.90202 +▁nor -7.90275 +▁among -7.9053 +ate -7.90969 +ies -7.91089 +▁p -7.91307 +ff -7.91729 +na -7.92272 +▁small -7.92689 +ty -7.92942 +ous -7.93067 +▁ga -7.93278 +▁whom -7.93725 +▁felt -7.93876 +▁hands -7.93947 +▁myself -7.94602 +▁high -7.94632 +▁ex -7.94686 +▁however -7.94887 +ia -7.94934 +▁herself -7.95264 +▁stood -7.95858 +▁kind -7.95874 +▁hundred -7.95955 +▁la -7.96684 +▁round -7.97066 +▁almost -7.97354 +om -7.98129 +▁since -7.9813 +sh -7.98849 +▁c -7.98852 +▁ten -7.9898 +▁rest -7.9973 +▁boy -7.99935 +▁mo -8.00015 +▁perhaps -8.00311 +ish -8.0036 +ru -8.0045 +▁words -8.00475 +mp -8.00876 +▁sat -8.01874 +co -8.02001 +▁replied -8.02087 +▁four -8.02469 +▁anything -8.02776 +as -8.02812 +▁till -8.02843 +x -8.02978 +ting -8.0301 +▁until -8.03441 +▁black -8.03588 +ated -8.03649 +me -8.03831 +▁b -8.04278 +id -8.04354 +▁cried -8.04406 +▁fact -8.05064 +▁help -8.05169 +▁next -8.05191 +ie -8.05368 +▁looking -8.05378 +▁friend -8.05529 +▁does -8.05546 +▁lay -8.05695 +▁brought -8.06229 +▁fire -8.06598 +▁keep -8.06679 +ver -8.07005 +▁sea -8.07356 +▁country -8.07394 +▁word -8.07524 +▁days -8.07754 +▁together -8.0803 +▁reason -8.0831 +ut -8.08642 +ance -8.0867 +▁indeed -8.08859 +▁matter -8.08986 +▁ra -8.09017 +▁li -8.09673 +▁air -8.09835 +▁full -8.09927 +▁rather -8.10244 +▁hope -8.10365 +▁land -8.1041 +gg -8.10417 +am -8.10449 +▁open -8.10788 +tic -8.10921 +▁feet -8.11058 +▁imp -8.11102 +ke -8.11263 +ine -8.11421 +▁d -8.11547 +▁five -8.11674 +▁point -8.11763 +▁large -8.1235 +ci -8.12437 +vi -8.1256 +▁child -8.13099 +▁gone -8.13104 +▁ho -8.1317 +pp -8.13272 +▁best -8.13427 +▁hard -8.13582 +ant -8.13757 +▁lord -8.13785 +▁wife -8.13848 +▁sure -8.13962 +de -8.14218 +po -8.14226 +▁form -8.14557 +▁death -8.14965 +▁care -8.15583 +ence -8.15604 +▁nature -8.15699 +▁co -8.15856 +▁believe -8.15947 +▁near -8.16247 +▁red -8.16407 +▁ro -8.16449 +▁ha -8.16607 +▁speak -8.16703 +▁fear -8.16889 +▁case -8.16944 +▁taken -8.17098 +▁cannot -8.17343 +▁hear -8.17518 +▁along -8.17564 +▁themselves -8.17588 +um -8.17641 +▁present -8.18164 +▁master -8.18704 +▁son -8.18955 +▁war -8.19388 +▁po -8.19446 +▁thus -8.19772 +▁true -8.20459 +▁car -8.20477 +▁less -8.20846 +▁thousand -8.21254 +▁w -8.21417 +mi -8.2162 +▁money -8.21713 +nd -8.21716 +▁da -8.21888 +▁power -8.22077 +▁behind -8.22087 +ard -8.2226 +to -8.22274 +▁children -8.2228 +▁doctor -8.22317 +▁dis -8.22371 +▁twenty -8.22732 +▁wish -8.22739 +▁sound -8.22843 +▁whose -8.23097 +▁leave -8.23197 +▁answered -8.23298 +▁thou -8.23321 +ac -8.23461 +▁dur -8.23471 +▁certain -8.2375 +ge -8.24317 +▁cl -8.24703 +▁g -8.24779 +▁passed -8.24862 +▁arm -8.25095 +mo -8.25395 +ious -8.2544 +▁state -8.25486 +▁alone -8.25597 +▁show -8.25689 +▁ba -8.25864 +▁need -8.25881 +▁live -8.26099 +▁dead -8.26254 +▁pro -8.26311 +▁mu -8.26701 +▁strong -8.26733 +▁en -8.26801 +▁bo -8.26981 +▁ground -8.27309 +▁short -8.27476 +▁st -8.27974 +▁horse -8.28616 +▁prince -8.28817 +▁pre -8.28817 +ian -8.29122 +at -8.29216 +un -8.29302 +▁fell -8.2982 +▁order -8.29901 +▁call -8.29938 +▁ca -8.30443 +▁sun -8.30517 +ta -8.30566 +▁given -8.30619 +▁therefore -8.30754 +▁dark -8.30758 +▁close -8.30816 +▁body -8.31022 +▁others -8.31043 +▁sent -8.31212 +ad -8.3132 +▁second -8.316 +red -8.31726 +▁often -8.31883 +▁manner -8.32481 +▁vi -8.32632 +▁f -8.33096 +▁lo -8.33173 +▁question -8.33377 +▁hour -8.33469 +▁turn -8.33975 +▁table -8.34248 +▁general -8.34277 +▁earth -8.34496 +▁bed -8.34708 +age -8.3481 +ward -8.35051 +▁really -8.35139 +▁six -8.35374 +▁become -8.35755 +▁read -8.36081 +▁use -8.36236 +▁coming -8.37141 +▁everything -8.37319 +▁above -8.37882 +▁evening -8.37903 +▁beautiful -8.3822 +▁feel -8.38244 +▁least -8.3841 +ical -8.38416 +▁law -8.38452 +▁already -8.38637 +▁rose -8.38677 +▁mean -8.38681 +▁ran -8.38738 +▁itself -8.38828 +▁soul -8.39221 +▁suddenly -8.39493 +▁around -8.39553 +▁ti -8.39629 +▁sa -8.39657 +▁answer -8.39921 +▁em -8.40114 +ber -8.40546 +que -8.40812 +ti -8.40975 +▁won -8.41017 +▁wind -8.41105 +▁fine -8.41304 +▁whether -8.41526 +▁known -8.41725 +▁captain -8.42272 +▁eye -8.42551 +▁person -8.42656 +▁women -8.42706 +▁sort -8.42764 +▁ask -8.42963 +▁per -8.43123 +▁brother -8.43586 +ni -8.43821 +▁used -8.44025 +▁held -8.44066 +▁big -8.44256 +▁returned -8.44473 +▁strange -8.44488 +no -8.45273 +▁free -8.45451 +▁either -8.45513 +▁within -8.45564 +▁doubt -8.45671 +▁year -8.45862 +▁clear -8.46003 +▁sight -8.46043 +▁lost -8.46111 +ho -8.46112 +▁se -8.46255 +▁le -8.46257 +▁kept -8.46289 +▁bar -8.46341 +▁bu -8.46354 +▁town -8.46388 +ring -8.46594 +▁sleep -8.46906 +ist -8.47099 +▁hair -8.47372 +▁friends -8.47427 +nt -8.4756 +▁dream -8.47568 +▁fellow -8.47629 +▁deep -8.47799 +▁past -8.4783 +▁became -8.47901 +op -8.48024 +▁making -8.48051 +▁act -8.48477 +bo -8.48576 +im -8.48695 +▁bad -8.4879 +ary -8.49097 +▁ta -8.49642 +ily -8.4979 +▁bring -8.498 +ster -8.49837 +▁ye -8.50127 +▁means -8.50147 +▁run -8.50334 +men -8.50338 +▁daughter -8.50689 +▁sense -8.50862 +cy -8.51181 +▁city -8.51186 +▁sometimes -8.51205 +▁towards -8.51344 +▁road -8.51845 +▁gra -8.51919 +▁ready -8.52448 +dy -8.5251 +ure -8.52531 +son -8.52666 +▁mar -8.52707 +▁cold -8.53015 +▁foot -8.53033 +▁else -8.53193 +▁letter -8.5321 +ud -8.53213 +▁k -8.53803 +▁sp -8.53997 +▁truth -8.54012 +▁idea -8.54104 +▁sta -8.54296 +▁business -8.54487 +▁subject -8.54754 +▁john -8.54757 +▁court -8.54846 +▁river -8.55047 +▁ru -8.55137 +▁di -8.5541 +▁family -8.5565 +▁didn -8.56006 +▁several -8.56147 +▁glad -8.56226 +ens -8.56422 +▁understand -8.56476 +▁possible -8.56873 +▁return -8.56875 +▁different -8.56878 +▁arms -8.5689 +he -8.57005 +▁low -8.57062 +▁hold -8.57171 +ating -8.57288 +▁talk -8.57294 +▁window -8.57563 +▁lu -8.57574 +▁sh -8.57632 +▁interest -8.57875 +▁sister -8.57949 +▁blood -8.58666 +▁says -8.58691 +land -8.59031 +▁th -8.59363 +▁human -8.59452 +▁cause -8.59568 +go -8.59691 +▁thank -8.59812 +▁late -8.59857 +▁cut -8.59993 +▁across -8.60115 +ng -8.60191 +▁story -8.6039 +ial -8.60458 +▁count -8.60531 +by -8.61141 +▁number -8.61156 +▁stand -8.61173 +▁able -8.61219 +per -8.61242 +▁church -8.61299 +che -8.61435 +les -8.61602 +▁thy -8.61746 +▁comp -8.61815 +▁suppose -8.6189 +▁effect -8.62111 +▁si -8.62299 +ba -8.62734 +▁spoke -8.62957 +▁green -8.6315 +▁husband -8.63174 +▁respect -8.63174 +cu -8.63314 +▁remember -8.63324 +▁followed -8.63382 +▁longer -8.63684 +ions -8.63877 +tro -8.63906 +▁taking -8.64065 +▁seem -8.64106 +▁t -8.64367 +▁happy -8.64443 +pe -8.64475 +▁line -8.64596 +ley -8.64671 +▁stay -8.6532 +▁play -8.6534 +▁common -8.65531 +be -8.65623 +▁times -8.65717 +▁book -8.65736 +und -8.65793 +▁object -8.66012 +▁seven -8.66091 +▁met -8.66215 +ca -8.66333 +▁age -8.66376 +▁sha -8.66505 +▁pretty -8.6663 +▁fair -8.66837 +do -8.66895 +▁wood -8.66965 +os -8.67011 +▁reached -8.6731 +▁sweet -8.67437 +▁appeared -8.67453 +▁fall -8.67545 +▁pass -8.67577 +▁sign -8.67655 +▁art -8.67659 +da -8.67771 +▁tree -8.68022 +▁garden -8.68055 +▁fl -8.68212 +▁remain -8.68618 +▁opened -8.68883 +qui -8.69114 +▁bright -8.69391 +▁street -8.6983 +▁hu -8.69925 +▁tu -8.70032 +▁trouble -8.70065 +▁pain -8.7029 +▁continued -8.70344 +▁school -8.70366 +▁carried -8.70421 +▁saying -8.70493 +▁follow -8.71325 +▁change -8.71328 +nce -8.71349 +▁gold -8.71391 +▁bear -8.71554 +▁su -8.71566 +▁feeling -8.71637 +▁command -8.71679 +▁certainly -8.71824 +▁blue -8.71904 +▁wild -8.72003 +▁account -8.72368 +▁ne -8.72403 +▁ought -8.72848 +▁fi -8.73365 +▁breath -8.73491 +▁wanted -8.73914 +ov -8.74173 +lt -8.74286 +▁ill -8.74353 +ow -8.74421 +▁sc -8.74663 +der -8.74682 +▁heaven -8.74684 +▁purpose -8.74686 +ha -8.74759 +▁character -8.74843 +▁rich -8.7515 +our -8.75547 +▁dress -8.75781 +▁english -8.76108 +▁chance -8.76254 +▁view -8.76496 +▁ship -8.76584 +▁toward -8.76672 +▁real -8.76718 +▁joy -8.76779 +▁cap -8.77235 +▁plan -8.77246 +▁neither -8.77275 +▁force -8.77285 +▁uncle -8.77317 +▁princess -8.77387 +▁har -8.77474 +▁hat -8.77801 +way -8.77869 +▁chief -8.77894 +▁lived -8.78017 +▁na -8.78141 +▁visit -8.7824 +▁mor -8.78381 +▁wall -8.78652 +▁pleasure -8.78739 +▁pe -8.7879 +▁smile -8.78797 +▁front -8.78866 +▁mine -8.78902 +▁ri -8.79253 +▁deal -8.79282 +ier -8.79326 +▁further -8.79368 +▁tried -8.79541 +▁none -8.80009 +uc -8.80166 +▁entered -8.80167 +▁pay -8.80408 +▁queen -8.80455 +▁except -8.80579 +va -8.80801 +▁forward -8.80805 +ot -8.80998 +▁eight -8.81171 +▁added -8.81314 +▁public -8.81323 +▁eighteen -8.81324 +ft -8.81377 +▁star -8.81398 +▁happened -8.81873 +ned -8.81953 +▁although -8.822 +▁later -8.82204 +▁walked -8.82218 +▁walk -8.82238 +▁spirit -8.8225 +▁bit -8.82313 +▁meet -8.82432 +▁led -8.82559 +fa -8.82849 +▁mouth -8.82946 +▁wait -8.83231 +rs -8.83281 +▁gu -8.83416 +▁hours -8.83454 +lin -8.83526 +▁living -8.83739 +▁yourself -8.83798 +em -8.83827 +▁fast -8.83971 +▁hall -8.84497 +▁beyond -8.84576 +▁boat -8.84732 +▁secret -8.84736 +▁chair -8.84911 +▁pu -8.85297 +▁received -8.85389 +▁pa -8.85426 +▁cat -8.8545 +▁desire -8.85826 +▁ja -8.8592 +▁gentleman -8.85927 +▁cra -8.85959 +ress -8.8609 +▁laid -8.86415 +▁party -8.86721 +▁wonder -8.86748 +▁occasion -8.86751 +ig -8.86771 +▁fish -8.87005 +▁mi -8.87027 +▁send -8.87486 +vo -8.87515 +ged -8.87522 +ak -8.87728 +▁nearly -8.87803 +con -8.87846 +▁try -8.8788 +▁seems -8.88114 +▁silence -8.88499 +▁bell -8.88523 +ever -8.88574 +▁bra -8.88685 +▁guard -8.88716 +▁rep -8.88973 +▁die -8.89013 +▁doing -8.89179 +▁early -8.89211 +ugh -8.89235 +▁bank -8.89235 +▁figure -8.89252 +den -8.89326 +▁england -8.89568 +▁mary -8.896 +▁fo -8.89799 +▁cor -8.89892 +▁afraid -8.90011 +▁watch -8.90402 +▁gre -8.90554 +▁aunt -8.91001 +tur -8.91229 +▁service -8.91353 +▁je -8.91387 +▁minutes -8.91421 +▁trees -8.91568 +▁glass -8.91774 +▁pan -8.91942 +▁va -8.91977 +▁tone -8.91998 +▁please -8.92034 +▁forth -8.92051 +▁cur -8.92101 +▁cross -8.92166 +▁fa -8.92184 +▁exclaimed -8.92273 +ler -8.92342 +▁pen -8.92344 +ten -8.92376 +▁pi -8.92426 +▁eat -8.92444 +▁drew -8.92453 +ble -8.92499 +ably -8.9255 +▁grave -8.92616 +▁miles -8.92876 +▁ago -8.92887 +▁position -8.9304 +▁warm -8.93052 +▁length -8.93236 +▁necessary -8.93236 +▁thinking -8.93313 +▁soft -8.9336 +▁picture -8.93367 +ship -8.93369 +ations -8.9338 +av -8.93443 +ible -8.93462 +▁ah -8.93999 +▁heavy -8.94029 +▁attention -8.94092 +▁dog -8.94119 +▁standing -8.94354 +rn -8.94361 +ron -8.94363 +▁natural -8.94438 +▁appear -8.94438 +▁caught -8.94556 +gra -8.94669 +▁spring -8.94922 +▁experience -8.94955 +▁pat -8.95299 +▁pri -8.95372 +▁stopped -8.95569 +▁regard -8.95615 +▁hardly -8.95978 +▁self -8.96008 +▁strength -8.96095 +kin -8.96238 +▁grew -8.96282 +▁knight -8.96298 +▁opinion -8.96298 +▁ab -8.96388 +rk -8.96526 +▁wide -8.96661 +▁instead -8.96774 +▁south -8.96781 +▁trans -8.96816 +▁learn -8.9712 +▁corner -8.97137 +▁island -8.97439 +▁third -8.97591 +▁straight -8.97728 +▁tea -8.97822 +▁bound -8.97901 +▁seeing -8.97967 +▁cha -8.98025 +▁dinner -8.98079 +▁beauty -8.98209 +▁peace -8.98292 +▁silent -8.98762 +▁cre -8.98909 +▁sw -8.99093 +▁step -8.99147 +▁jo -8.99178 +▁wa -8.99194 +▁sitting -8.99214 +▁thirty -8.99247 +▁save -8.99425 +▁glance -8.99532 +▁loved -8.99677 +▁reach -8.99979 +▁action -9.00043 +▁ver -9.0005 +ger -9.00278 +▁sad -9.00395 +▁stone -9.00628 +ened -9.00671 +▁french -9.00862 +▁m -9.0087 +▁struck -9.01003 +▁paper -9.01106 +ally -9.01111 +▁whatever -9.01193 +▁sub -9.01227 +▁distance -9.01287 +▁wrong -9.01358 +▁knowledge -9.01358 +▁safe -9.01474 +▁snow -9.01501 +▁fifty -9.01643 +▁attempt -9.01714 +▁music -9.01799 +▁government -9.01876 +▁crowd -9.02244 +▁besides -9.02296 +▁box -9.02356 +▁direction -9.02387 +▁train -9.02393 +▁north -9.02395 +ped -9.02429 +▁el -9.02475 +▁thick -9.02509 +▁getting -9.02554 +▁floor -9.0289 +▁company -9.03007 +▁blow -9.03021 +bu -9.03086 +▁plain -9.03126 +▁beside -9.0315 +ities -9.03293 +▁rock -9.03348 +▁immediately -9.03354 +▁shadow -9.03442 +▁sit -9.03601 +▁drink -9.03952 +king -9.04249 +▁spot -9.04416 +▁danger -9.04433 +▁wi -9.04538 +▁saint -9.04685 +▁slowly -9.04691 +ah -9.04742 +▁palace -9.04831 +ors -9.04944 +▁peter -9.05013 +▁result -9.05052 +ric -9.05115 +▁forest -9.05173 +▁tears -9.0564 +ism -9.05656 +▁belong -9.05664 +▁appearance -9.05678 +▁par -9.05711 +▁gate -9.05778 +▁ju -9.06233 +▁quickly -9.06437 +▁fit -9.06524 +▁quiet -9.06573 +ris -9.06619 +▁london -9.06688 +▁start -9.06791 +rt -9.06846 +▁brown -9.06949 +▁consider -9.07025 +▁battle -9.07145 +▁anne -9.07195 +▁piece -9.07248 +▁died -9.07512 +▁success -9.07617 +▁post -9.07672 +▁lips -9.07702 +▁filled -9.078 +▁forget -9.07832 +ified -9.08089 +▁margaret -9.08123 +▁food -9.08284 +▁pleasant -9.08657 +ner -9.08809 +▁expression -9.08909 +▁pocket -9.08963 +fi -9.08995 +▁wear -9.09356 +▁fresh -9.09425 +au -9.09646 +ham -9.09714 +▁broken -9.09722 +▁laughed -9.09757 +▁following -9.09843 +▁youth -9.09887 +▁touch -9.10015 +▁sal -9.10107 +▁week -9.10288 +▁remained -9.10418 +▁leg -9.10432 +▁easy -9.1051 +▁al -9.10564 +▁enter -9.10865 +▁ste -9.1089 +▁ch -9.10922 +▁fight -9.10933 +▁placed -9.10947 +▁travel -9.10964 +▁simple -9.11135 +▁girls -9.11236 +▁waiting -9.11512 +▁stop -9.11684 +if -9.11804 +ile -9.11906 +ning -9.11982 +▁camp -9.12002 +▁ni -9.12035 +▁wise -9.12043 +▁office -9.12111 +▁fe -9.12205 +▁grand -9.12295 +▁judge -9.12363 +ny -9.12381 +▁quick -9.12617 +tri -9.12647 +▁du -9.12874 +▁fra -9.12979 +▁flo -9.1301 +ging -9.13045 +▁comfort -9.13208 +▁particular -9.13305 +▁suit -9.1338 +▁started -9.13391 +▁top -9.13613 +▁hot -9.13623 +▁impossible -9.13675 +ach -9.13707 +▁pale -9.13732 +ments -9.13795 +▁ve -9.13914 +▁conversation -9.13917 +▁scene -9.14081 +▁boys -9.14082 +▁society -9.14402 +▁outside -9.14432 +▁write -9.14476 +▁effort -9.14645 +▁talking -9.14693 +▁fortune -9.14726 +▁nine -9.14985 +▁single -9.151 +▁cro -9.152 +▁port -9.15411 +▁happen -9.15427 +▁rule -9.15463 +▁cast -9.15628 +▁shut -9.15709 +▁noble -9.15917 +▁gun -9.15924 +▁path -9.15997 +▁begin -9.16092 +▁win -9.16136 +▁sky -9.16149 +▁wonderful -9.16515 +▁sudden -9.16577 +▁army -9.16589 +ga -9.16805 +▁mountain -9.16841 +▁worth -9.16959 +▁grace -9.17162 +▁below -9.17203 +▁chapter -9.17215 +▁turning -9.17273 +▁afternoon -9.17612 +▁iron -9.17626 +▁bow -9.17691 +up -9.17693 +▁evil -9.17696 +▁trust -9.17749 +ag -9.17757 +▁recogni -9.1778 +▁ring -9.17871 +▁lad -9.17907 +▁sail -9.18071 +▁content -9.18118 +▁horses -9.18165 +▁silver -9.18199 +ory -9.18236 +ay -9.18273 +▁tri -9.18493 +▁running -9.18731 +▁hill -9.18744 +▁beginning -9.18888 +▁habit -9.1913 +▁mad -9.19289 +pa -9.19389 +▁clothes -9.19512 +▁morrow -9.19566 +▁cry -9.19577 +▁fashion -9.1964 +▁presence -9.19642 +▁min -9.19708 +▁tra -9.19725 +▁arrived -9.19781 +▁quarter -9.19811 +▁perfect -9.19902 +▁usual -9.19961 +▁neck -9.19975 +▁married -9.19983 +▁seat -9.20022 +wi -9.20071 +▁sand -9.20413 +▁shore -9.20419 +ries -9.20447 +▁giving -9.20584 +▁probably -9.2067 +▁expect -9.20736 +▁minute -9.20838 +▁shot -9.20958 +▁instant -9.21089 +▁degree -9.21275 +▁color -9.21461 +▁west -9.21547 +▁winter -9.21587 +ran -9.21593 +val -9.21703 +▁march -9.21721 +▁gar -9.21774 +▁bird -9.21826 +▁serious -9.21896 +▁greater -9.21909 +▁showed -9.21924 +▁covered -9.21941 +▁former -9.21951 +▁carry -9.21985 +▁loud -9.22023 +▁moved -9.2207 +▁mass -9.22168 +▁tom -9.22175 +lar -9.22214 +▁roman -9.22598 +▁moon -9.22677 +▁stream -9.22937 +▁easily -9.23026 +▁couldn -9.2303 +ey -9.23089 +▁search -9.23115 +▁board -9.23122 +▁wished -9.23148 +ap -9.23201 +▁months -9.23242 +▁sick -9.23317 +▁bla -9.23394 +▁duty -9.23511 +▁twelve -9.23557 +▁faint -9.23649 +▁hi -9.23676 +▁stranger -9.23765 +▁surprise -9.23849 +▁kill -9.23864 +fe -9.239 +▁leaving -9.23913 +ub -9.23923 +▁journey -9.24091 +▁raised -9.24202 +▁scarcely -9.24209 +▁speaking -9.2426 +▁terrible -9.24359 +▁game -9.24488 +▁field -9.24561 +▁mer -9.24586 +▁promise -9.24657 +▁condition -9.24771 +▁personal -9.24929 +▁tall -9.24935 +▁stick -9.25 +▁threw -9.25168 +ip -9.25241 +▁marry -9.25282 +ative -9.25306 +gi -9.25323 +▁van -9.25378 +▁according -9.25484 +▁burn -9.25574 +▁sei -9.25721 +▁lie -9.25726 +▁attack -9.25802 +▁sword -9.25809 +▁rise -9.25828 +▁thoughts -9.25867 +side -9.25899 +▁guess -9.25901 +▁dar -9.26041 +▁calm -9.26116 +▁thin -9.2615 +▁village -9.26256 +▁anxious -9.26439 +▁expected -9.26601 +▁ball -9.26745 +▁especially -9.26805 +▁charge -9.26831 +▁measure -9.26897 +gn -9.26921 +▁seek -9.26938 +▁te -9.26963 +▁nice -9.2709 +her -9.27108 +▁trying -9.27193 +▁allow -9.27357 +▁bread -9.27449 +▁sharp -9.27462 +gu -9.27478 +▁honour -9.27541 +▁honor -9.27635 +▁entirely -9.2768 +▁bill -9.27739 +rous -9.27784 +▁bri -9.27788 +▁written -9.27819 +▁broke -9.27946 +▁killed -9.2795 +wa -9.28007 +▁offer -9.28008 +▁ladies -9.28047 +▁mark -9.28091 +▁flowers -9.28165 +▁learned -9.28181 +▁forty -9.28372 +▁happiness -9.28469 +▁pray -9.28486 +▁class -9.28584 +▁principle -9.28749 +▁ven -9.28892 +gen -9.28901 +▁fer -9.28919 +▁shape -9.28928 +▁summer -9.28943 +▁books -9.2895 +▁jack -9.28989 +▁draw -9.29038 +tin -9.2915 +▁golden -9.29273 +▁decided -9.29353 +▁unless -9.29627 +▁lead -9.29655 +▁listen -9.29844 +▁shook -9.29892 +▁noise -9.29931 +▁influence -9.29972 +eth -9.30032 +▁perfectly -9.30091 +▁marriage -9.30257 +▁broad -9.30274 +▁states -9.30314 +▁escape -9.30317 +▁middle -9.30362 +▁plant -9.30436 +▁movement -9.30501 +▁enemy -9.30542 +▁break -9.30544 +▁history -9.30549 +▁understood -9.30637 +▁latter -9.30638 +▁comes -9.30659 +wn -9.30685 +▁merely -9.3078 +▁simply -9.30828 +▁imagine -9.31019 +▁lower -9.3121 +▁born -9.31282 +▁conduct -9.31306 +▁yard -9.31406 +▁den -9.31624 +▁closed -9.31666 +▁fro -9.31877 +▁makes -9.31891 +lie -9.32113 +▁exist -9.32174 +▁speech -9.3227 +▁bitter -9.3235 +jo -9.3246 +hi -9.3254 +ib -9.32565 +▁grass -9.32705 +▁reply -9.32779 +▁changed -9.32821 +▁ka -9.3295 +▁dance -9.3312 +▁lying -9.33191 +▁finally -9.33222 +▁american -9.33343 +▁enjoy -9.33348 +▁contain -9.33439 +▁observed -9.33536 +▁meant -9.33571 +▁flu -9.3378 +ev -9.33858 +▁laugh -9.34134 +oo -9.34138 +▁afterwards -9.34164 +pose -9.34235 +▁beat -9.34266 +▁equal -9.3437 +▁race -9.34393 +▁rain -9.34564 +▁steps -9.34565 +▁gi -9.3462 +▁beneath -9.34821 +io -9.34833 +▁tail -9.34953 +▁taste -9.35112 +▁che -9.3514 +▁char -9.35243 +▁grow -9.35273 +clock -9.35505 +▁repeated -9.3551 +▁move -9.3553 +▁mon -9.35718 +▁lot -9.35898 +▁note -9.36107 +ther -9.36128 +▁madame -9.36149 +▁brave -9.36158 +ians -9.36183 +▁castle -9.36196 +bi -9.36309 +▁future -9.36322 +▁relation -9.36426 +▁sorry -9.36427 +▁health -9.36434 +▁dick -9.36447 +▁building -9.36547 +lf -9.36874 +▁edge -9.36921 +▁bless -9.36973 +▁mis -9.36985 +▁spite -9.36994 +mer -9.37185 +▁mill -9.37444 +▁prisoner -9.37517 +▁allowed -9.37651 +▁catch -9.379 +▁coat -9.38075 +▁complete -9.38129 +▁wouldn -9.382 +the -9.38299 +▁yellow -9.3836 +▁important -9.38367 +▁creature -9.38369 +▁passing -9.38461 +▁darkness -9.38601 +▁carriage -9.38669 +▁fifteen -9.38772 +▁hung -9.38791 +▁spread -9.38876 +▁pleased -9.38883 +▁curious -9.38918 +▁reali -9.38934 +▁worse -9.3898 +ement -9.39043 +▁circumstances -9.39055 +▁qua -9.39079 +▁din -9.39256 +▁jane -9.39383 +▁add -9.39383 +▁east -9.3941 +▁cup -9.39472 +▁blind -9.39499 +▁passion -9.39519 +▁discovered -9.39614 +▁notice -9.39644 +▁report -9.39752 +we -9.39837 +▁space -9.39918 +▁com -9.4017 +▁presently -9.40287 +▁sorrow -9.40336 +▁pack -9.40421 +▁dry -9.40549 +▁ancient -9.40651 +fer -9.40713 +▁cover -9.40802 +▁dressed -9.40804 +▁existence -9.40998 +▁exactly -9.41068 +▁beast -9.41096 +▁proper -9.41119 +▁dropped -9.41192 +▁clean -9.41286 +▁colour -9.41297 +▁host -9.41436 +▁mere -9.41572 +and -9.4175 +▁determined -9.41801 +▁chamber -9.41816 +cent -9.41871 +▁faith -9.41872 +▁sto -9.4188 +▁skin -9.421 +▁storm -9.42138 +▁persons -9.42186 +▁priest -9.42212 +▁pick -9.42288 +▁support -9.4235 +▁narrow -9.4235 +▁private -9.42457 +▁smiled -9.42561 +▁cousin -9.42672 +▁drawing -9.42682 +▁attend -9.42755 +▁cook -9.42811 +▁prevent -9.42995 +▁various -9.43011 +▁hole -9.43205 +▁weak -9.43221 +▁fixed -9.43226 +let -9.43406 +▁bottom -9.43427 +▁nobody -9.43427 +▁eli -9.43557 +▁legs -9.43638 +▁ar -9.43728 +ade -9.4384 +▁individual -9.43861 +▁dare -9.43865 +▁ears -9.44178 +ug -9.44328 +▁advantage -9.44516 +▁france -9.44539 +▁lives -9.44639 +▁wine -9.44744 +▁walls -9.44867 +▁tired -9.44922 +▁shop -9.44987 +▁cru -9.45028 +▁animal -9.45076 +▁wrote -9.45175 +▁royal -9.45176 +ki -9.45265 +▁isn -9.45395 +▁bon -9.45485 +▁considered -9.45562 +▁moral -9.45564 +▁companion -9.4577 +▁lose -9.45813 +▁lake -9.45864 +▁bag -9.46002 +▁letters -9.46007 +▁luck -9.46037 +▁sy -9.46198 +hood -9.46307 +▁inter -9.46621 +▁german -9.46634 +▁sake -9.46706 +▁drop -9.46715 +▁paid -9.4679 +▁ear -9.46913 +▁breakfast -9.46953 +▁labor -9.46955 +▁desert -9.47071 +▁declared -9.47139 +▁study -9.47178 +▁instance -9.47184 +▁song -9.47236 +▁somewhat -9.47291 +▁cloth -9.47377 +▁colonel -9.47403 +▁special -9.47403 +▁value -9.47527 +ld -9.47606 +▁main -9.47694 +▁proud -9.47697 +▁express -9.47824 +▁nation -9.47829 +▁handsome -9.47938 +▁confess -9.47973 +ps -9.48006 +▁passage -9.48021 +▁period -9.48082 +▁gen -9.4815 +▁christ -9.48187 +▁custom -9.48309 +row -9.4831 +▁hurt -9.48337 +▁shoulder -9.48433 +▁cu -9.48495 +▁sin -9.48574 +▁receive -9.48598 +ite -9.48641 +light -9.48678 +▁difficult -9.48784 +ple -9.48865 +▁depend -9.48879 +▁meeting -9.48891 +▁heat -9.48893 +▁believed -9.48972 +▁social -9.48997 +▁difficulty -9.4905 +▁greatest -9.4908 +▁drawn -9.49088 +▁grant -9.49184 +▁birds -9.49301 +▁angry -9.49342 +ign -9.49466 +▁places -9.49511 +▁gri -9.4964 +▁courage -9.49683 +▁disc -9.4972 +▁evidently -9.49722 +▁gentle -9.49742 +▁cruel -9.49742 +▁george -9.49798 +▁due -9.49871 +▁paris -9.50034 +▁knows -9.50057 +▁knowing -9.50084 +▁servant -9.50088 +▁writing -9.50377 +▁pure -9.50397 +▁holding -9.50448 +▁remembered -9.50481 +▁tender -9.5049 +▁whi -9.50695 +▁burst -9.50701 +▁surely -9.50748 +▁valley -9.50855 +hy -9.51064 +▁conf -9.51116 +▁spoken -9.51131 +▁christian -9.51262 +▁store -9.51318 +▁henry -9.51332 +▁finished -9.51369 +▁qui -9.51369 +▁ob -9.51392 +▁prove -9.51443 +▁fool -9.51478 +▁ban -9.51521 +▁soldiers -9.51612 +▁language -9.51779 +▁inside -9.51827 +▁fallen -9.5209 +itch -9.52244 +▁baby -9.52317 +▁pot -9.52331 +▁situation -9.5237 +▁ruin -9.52474 +▁watched -9.52482 +▁gentlemen -9.52509 +▁fancy -9.52617 +▁accept -9.52659 +▁mal -9.52755 +▁season -9.52821 +▁ourselves -9.52844 +▁speed -9.53094 +ans -9.53103 +nic -9.53266 +▁fu -9.53441 +▁cool -9.53512 +form -9.53515 +▁vessel -9.53561 +▁william -9.53563 +▁serve -9.53642 +▁obliged -9.53681 +▁group -9.53691 +my -9.53852 +od -9.53859 +▁leaves -9.53884 +▁goes -9.53981 +▁peculiar -9.54041 +▁news -9.54053 +▁vain -9.54213 +▁everybody -9.54282 +▁pin -9.5434 +▁forgotten -9.54412 +▁carefully -9.54456 +▁flash -9.54524 +uous -9.54561 +ook -9.54675 +ched -9.54731 +▁murder -9.54736 +▁und -9.54748 +▁delight -9.54769 +▁waited -9.54905 +▁roll -9.54927 +▁property -9.54931 +▁noticed -9.54941 +▁hum -9.54975 +han -9.54979 +▁fur -9.55108 +▁knock -9.55131 +▁earnest -9.55152 +▁ge -9.55239 +uch -9.55241 +▁honest -9.55375 +▁promised -9.55457 +wood -9.55616 +▁san -9.55635 +▁walking -9.55738 +▁quietly -9.55865 +▁square -9.55866 +▁cloud -9.5589 +one -9.55892 +▁higher -9.56088 +▁built -9.5611 +▁formed -9.56135 +▁teach -9.56201 +▁fate -9.56269 +▁false -9.56356 +▁york -9.56368 +▁bal -9.56386 +▁climb -9.56479 +▁dust -9.56506 +▁fond -9.56536 +▁grown -9.56693 +▁fruit -9.5685 +▁generally -9.56896 +▁offered -9.57025 +▁nurse -9.57101 +▁spent -9.57227 +▁join -9.57301 +▁meaning -9.57367 +▁smoke -9.57471 +▁station -9.57515 +▁rough -9.57528 +line -9.5754 +ju -9.57649 +▁likely -9.57725 +▁surface -9.57845 +▁month -9.57879 +▁r -9.5807 +▁possession -9.58089 +▁tongue -9.58102 +for -9.58136 +ang -9.58153 +▁duke -9.5827 +stra -9.58404 +▁laughing -9.58435 +▁weather -9.58474 +▁whispered -9.58519 +gan -9.58545 +▁rag -9.58575 +▁system -9.58599 +▁laws -9.58622 +▁touched -9.58764 +▁nose -9.58808 +▁surprised -9.58815 +▁wealth -9.58855 +▁trade -9.58885 +▁nu -9.58947 +▁temper -9.58978 +▁frank -9.58978 +▁arch -9.59065 +▁opportunity -9.59231 +▁animals -9.59345 +▁bare -9.59353 +▁claim -9.59358 +▁cost -9.59584 +▁opposite -9.59739 +▁police -9.59739 +▁key -9.59776 +▁ideas -9.59836 +▁wave -9.5985 +▁cal -9.5994 +▁reading -9.60061 +▁corn -9.6011 +▁collect -9.60123 +ker -9.60382 +▁gray -9.60456 +▁crown -9.60465 +▁shoulders -9.60493 +▁swift -9.60507 +▁wash -9.60516 +▁ice -9.60591 +▁tar -9.60632 +use -9.6067 +▁prepared -9.6068 +▁gro -9.60782 +lac -9.60967 +▁empty -9.61022 +▁share -9.61049 +▁smiling -9.61152 +▁avoid -9.61153 +▁difference -9.61161 +▁explain -9.61169 +▁pour -9.61217 +▁fat -9.61242 +▁attract -9.61281 +▁opening -9.61463 +▁breast -9.6154 +▁material -9.6154 +▁wheel -9.6154 +ius -9.61563 +▁suffering -9.61577 +▁distinct -9.61639 +▁rever -9.61748 +▁sing -9.61819 +▁chi -9.61843 +▁fingers -9.61874 +▁altogether -9.6193 +▁papa -9.6196 +dding -9.62028 +▁brain -9.62096 +▁row -9.62113 +▁asleep -9.62191 +▁grey -9.62254 +▁windows -9.62363 +▁alive -9.62446 +▁proceed -9.62486 +▁flower -9.62538 +▁pieces -9.6261 +▁leap -9.62618 +pping -9.62686 +ef -9.6269 +▁alter -9.62705 +▁memory -9.62717 +aw -9.62815 +▁fill -9.62844 +▁thrown -9.62844 +▁rode -9.6292 +▁kingdom -9.6298 +▁dish -9.62982 +▁mat -9.63055 +▁maid -9.6322 +▁band -9.63234 +some -9.63329 +▁virtue -9.63374 +▁clo -9.63425 +▁guest -9.63479 +▁loss -9.63491 +▁caused -9.63624 +bra -9.63641 +▁motion -9.63672 +▁lovely -9.63741 +▁swa -9.63749 +▁million -9.63758 +▁fault -9.63772 +▁united -9.63911 +oc -9.64057 +▁mountains -9.64071 +▁pur -9.64112 +▁dim -9.64149 +▁satisfied -9.6417 +▁lover -9.64196 +▁harm -9.64233 +▁dollars -9.64303 +▁hero -9.64369 +▁conceal -9.64437 +▁vast -9.64488 +▁hath -9.64582 +▁rush -9.64604 +▁despair -9.64704 +▁pull -9.64708 +lan -9.64708 +▁height -9.64721 +ex -9.64763 +▁pet -9.64824 +ney -9.64929 +▁spi -9.64936 +▁remark -9.64976 +▁pity -9.64999 +▁rising -9.65036 +▁bent -9.65173 +▁hurry -9.65242 +▁bree -9.65243 +ddle -9.65325 +▁pride -9.65356 +▁settled -9.65371 +▁justice -9.65381 +▁finding -9.65389 +▁lifted -9.65406 +▁soldier -9.65444 +▁regular -9.65511 +▁struggle -9.65511 +▁machine -9.65512 +▁sum -9.65631 +▁hurried -9.65647 +▁sufficient -9.65738 +▁throw -9.65747 +▁represent -9.65772 +▁supper -9.65918 +▁double -9.65922 +▁alarm -9.65924 +▁dreadful -9.65954 +▁stock -9.66116 +▁flow -9.66166 +▁example -9.66189 +▁roof -9.66189 +▁ce -9.66229 +▁supposed -9.66546 +▁preserv -9.666 +▁listened -9.66708 +▁col -9.66819 +▁secure -9.67009 +▁frightened -9.67014 +ka -9.6705 +▁drive -9.67127 +▁disturb -9.67145 +▁emotion -9.67283 +▁servants -9.6735 +▁buy -9.674 +▁forced -9.67485 +▁kitchen -9.67558 +rin -9.6761 +▁terror -9.67696 +▁stairs -9.677 +▁sixty -9.67838 +▁ordinary -9.67972 +▁directly -9.67979 +▁heads -9.67985 +▁greatly -9.68092 +▁method -9.68111 +▁forgive -9.68116 +▁awful -9.68119 +▁reflect -9.68138 +▁talked -9.68277 +▁favour -9.6838 +ties -9.68388 +▁welcome -9.68388 +▁tin -9.6845 +▁yo -9.68486 +▁butter -9.68532 +▁control -9.68668 +▁angel -9.68714 +▁vo -9.68747 +stone -9.68797 +▁ordered -9.6884 +▁usually -9.68842 +▁poet -9.68918 +▁bold -9.68985 +ridge -9.69084 +▁adventure -9.69092 +▁watching -9.69214 +▁ride -9.69302 +▁folk -9.69436 +▁mistress -9.69518 +▁rate -9.69657 +▁growing -9.69734 +▁evidence -9.69788 +▁cave -9.69821 +▁j -9.69842 +▁finger -9.69866 +bbe -9.699 +▁seventeen -9.69929 +▁moving -9.69932 +▁cow -9.69957 +▁doesn -9.69962 +ator -9.70019 +▁type -9.70071 +▁tale -9.70074 +▁boil -9.70121 +▁deliver -9.70212 +ire -9.70237 +▁farm -9.70249 +▁mil -9.70318 +▁feelings -9.70333 +▁monsieur -9.70353 +▁gathered -9.7039 +▁putting -9.70417 +▁remarked -9.70434 +▁er -9.70444 +▁contrary -9.70495 +iness -9.70602 +▁crime -9.7078 +▁nearer -9.70882 +▁shame -9.71081 +▁loose -9.71084 +▁discover -9.71192 +▁flat -9.71232 +▁fail -9.7131 +▁twice -9.7135 +▁pla -9.71489 +▁europe -9.71637 +▁patient -9.71637 +▁unto -9.71665 +▁pair -9.71729 +▁suffer -9.7173 +tte -9.71755 +ea -9.71796 +▁hy -9.71815 +▁treasure -9.71925 +▁eager -9.72052 +▁bi -9.72074 +▁salt -9.72239 +▁fly -9.72313 +▁parts -9.7254 +pec -9.72573 +▁arthur -9.72647 +▁affairs -9.7268 +▁slow -9.72704 +▁consist -9.72808 +▁devil -9.72834 +▁affection -9.73001 +▁bore -9.7301 +▁kiss -9.73036 +▁engaged -9.73052 +▁officer -9.73173 +ification -9.73228 +▁milk -9.73339 +▁process -9.73375 +▁gift -9.73398 +▁dan -9.73398 +▁lamp -9.73427 +▁hid -9.73427 +▁pulled -9.73464 +▁excellent -9.73521 +▁impression -9.73522 +▁telling -9.73545 +▁proved -9.73575 +▁authority -9.73576 +▁tower -9.73802 +▁consequence -9.73814 +▁ray -9.73837 +▁favor -9.73953 +▁flew -9.73962 +▁charles -9.73993 +▁address -9.73994 +▁familiar -9.74108 +▁confidence -9.74112 +▁limit -9.74112 +▁weeks -9.74244 +▁woods -9.74288 +▁direct -9.74355 +▁intention -9.74383 +▁rare -9.74439 +▁perform -9.74547 +▁solemn -9.74551 +▁distant -9.74552 +▁bur -9.74558 +▁image -9.74713 +▁president -9.74847 +▁firm -9.74855 +▁indian -9.74876 +▁rid -9.74907 +▁rank -9.74916 +▁liked -9.74918 +▁houses -9.74982 +▁agree -9.75016 +▁ya -9.7506 +▁matters -9.7508 +▁working -9.75208 +▁prison -9.75226 +▁major -9.75227 +▁slip -9.75273 +like -9.75278 +▁mode -9.75344 +▁aware -9.75452 +▁looks -9.75466 +▁weight -9.75468 +▁busy -9.75475 +▁wound -9.7562 +▁bath -9.75727 +hen -9.75879 +▁wore -9.75892 +▁exercise -9.7604 +▁similar -9.7604 +▁amount -9.7619 +▁questions -9.76376 +▁violent -9.76642 +▁excuse -9.76643 +▁aside -9.76705 +▁dull -9.76778 +▁emperor -9.76793 +▁nevertheless -9.76793 +▁shout -9.76836 +gue -9.76895 +▁explained -9.76923 +▁accomplish -9.76944 +lung -9.77072 +▁instantly -9.77126 +▁mistake -9.77134 +▁smooth -9.77248 +▁strike -9.77248 +▁horror -9.77552 +▁science -9.77552 +▁protest -9.77553 +▁bob -9.77559 +▁obey -9.77567 +▁manage -9.77573 +▁ama -9.77643 +▁press -9.77671 +▁necessity -9.77704 +▁splendid -9.77704 +▁holy -9.77754 +▁interesting -9.7778 +ath -9.7784 +▁religion -9.77857 +▁unknown -9.77857 +▁fierce -9.7801 +▁disappeared -9.78045 +▁unc -9.78099 +▁naturally -9.7813 +▁louis -9.78163 +▁drove -9.78164 +▁played -9.78241 +▁brand -9.78401 +ford -9.78471 +▁hate -9.78556 +▁lines -9.78597 +▁shoot -9.78625 +▁consent -9.78635 +▁agreed -9.7869 +▁seated -9.78715 +▁stir -9.78774 +▁circle -9.78778 +▁streets -9.78825 +bble -9.78905 +▁task -9.78939 +▁produced -9.7904 +▁accident -9.79087 +burg -9.79088 +▁lin -9.79162 +▁witness -9.79162 +▁liberty -9.79241 +▁detail -9.79242 +▁minister -9.79242 +▁powerful -9.79327 +▁savage -9.79397 +▁sixteen -9.79397 +▁pretend -9.79552 +▁coast -9.79554 +▁utter -9.79799 +▁named -9.79837 +▁clever -9.7993 +▁admit -9.79966 +▁couple -9.80019 +▁message -9.80021 +▁wicked -9.80023 +▁bro -9.80067 +▁temple -9.80175 +▁stones -9.80204 +▁yesterday -9.80332 +▁hills -9.80372 +▁plea -9.80428 +▁sca -9.80497 +▁slight -9.80546 +▁squ -9.80554 +▁diamond -9.80646 +▁possibly -9.80646 +▁affair -9.80767 +▁hearing -9.8086 +▁original -9.80867 +▁sell -9.80869 +▁worthy -9.80872 +▁cottage -9.8096 +▁progress -9.8096 +▁sacrifice -9.8096 +▁shock -9.80961 +▁sunday -9.80961 +▁design -9.80964 +▁sought -9.80966 +lus -9.81045 +▁otherwise -9.81118 +right -9.81118 +▁prayer -9.81126 +▁cabin -9.81127 +▁dwell -9.81146 +▁rev -9.81234 +▁bridge -9.81314 +▁particularly -9.81374 +ied -9.81392 +▁yield -9.81434 +▁treat -9.81442 +▁oak -9.81465 +▁gain -9.81614 +win -9.81616 +▁rope -9.81746 +tan -9.81759 +ou -9.81816 +▁orders -9.81844 +▁suspect -9.8191 +▁edward -9.82087 +▁eleven -9.82229 +ability -9.82243 +▁occurred -9.82244 +▁teeth -9.82246 +▁val -9.82333 +▁lion -9.82382 +▁america -9.82547 +▁falling -9.8255 +ists -9.82559 +▁depart -9.82607 +▁keeping -9.82633 +▁demand -9.82658 +nny -9.82735 +▁paused -9.82763 +▁ceased -9.82864 +▁cheer -9.83045 +▁pardon -9.83193 +▁native -9.83194 +oon -9.83204 +▁beg -9.83285 +itude -9.83312 +▁dogs -9.83322 +▁required -9.8337 +▁elect -9.83506 +▁entertain -9.83514 +ina -9.83517 +▁blu -9.83533 +▁huge -9.83628 +▁carrying -9.83629 +▁insist -9.83641 +▁satisfaction -9.83676 +board -9.83736 +▁upper -9.83744 +ord -9.8376 +▁hunt -9.83761 +▁countenance -9.83838 +▁maiden -9.83958 +▁james -9.84004 +▁foreign -9.84011 +▁failed -9.84019 +▁gather -9.8402 +▁fun -9.8409 +▁test -9.84104 +▁pal -9.84163 +▁mighty -9.84183 +▁pit -9.8431 +▁silk -9.84328 +▁terms -9.8435 +▁page -9.84434 +▁knees -9.84447 +▁brothers -9.84472 +▁shown -9.8448 +▁professor -9.84527 +▁log -9.84552 +more -9.84553 +▁defi -9.8461 +▁cart -9.84746 +▁charm -9.84749 +▁require -9.84799 +▁proof -9.84816 +▁softly -9.84961 +▁unfortunate -9.8498 +▁possessed -9.84987 +▁severe -9.85032 +▁singing -9.85039 +▁stage -9.8507 +▁medi -9.85097 +▁price -9.85122 +▁freedom -9.85145 +▁farther -9.85228 +▁shouted -9.85263 +▁majesty -9.85309 +▁previous -9.85309 +▁guide -9.85355 +▁match -9.85362 +▁chest -9.85369 +▁intended -9.85443 +▁excitement -9.85485 +▁officers -9.85487 +▁shake -9.85565 +▁sentiment -9.85639 +▁gently -9.85644 +▁succeeded -9.85691 +▁sur -9.85879 +▁ki -9.8588 +pha -9.85914 +▁mention -9.85927 +▁acquaintance -9.85969 +▁imagination -9.85969 +▁physical -9.85969 +▁leading -9.85978 +▁slave -9.8605 +▁lock -9.8607 +▁base -9.86187 +▁steam -9.86204 +▁term -9.86288 +▁pointed -9.86301 +▁pipe -9.86304 +▁shade -9.86323 +▁invent -9.86325 +▁regret -9.86468 +▁alas -9.86474 +▁faithful -9.86713 +▁worked -9.86766 +▁bay -9.86795 +▁record -9.86801 +▁complain -9.86802 +▁mentioned -9.86831 +▁superior -9.86969 +▁hotel -9.87087 +▁seventy -9.87096 +▁sheep -9.87201 +▁advice -9.87304 +▁hidden -9.8732 +▁demanded -9.87361 +▁fore -9.8737 +▁meal -9.87387 +▁conscious -9.8739 +ky -9.87404 +▁possess -9.87473 +▁praise -9.87488 +▁brow -9.87501 +▁fourth -9.87589 +▁events -9.87621 +▁advanced -9.87786 +▁resolved -9.87809 +▁stuff -9.87809 +▁cheerful -9.87861 +▁fri -9.87884 +▁fairy -9.87922 +▁birth -9.87978 +▁afford -9.8798 +▁grief -9.87988 +▁sides -9.88093 +▁substance -9.88147 +▁article -9.88148 +▁level -9.8815 +▁wake -9.88165 +ville -9.88325 +▁joined -9.88349 +▁mist -9.88439 +▁practical -9.88486 +▁clearly -9.88488 +▁trace -9.88538 +▁awake -9.8864 +▁lack -9.88656 +▁basket -9.88656 +▁observe -9.88658 +ette -9.88747 +▁spirits -9.88853 +▁excited -9.88955 +▁abandon -9.88997 +▁shining -9.89001 +▁fully -9.89019 +▁calling -9.89202 +van -9.89205 +▁considerable -9.89318 +▁sprang -9.8934 +▁mile -9.89356 +▁dangerous -9.89425 +▁pounds -9.89446 +▁jew -9.89454 +▁fox -9.89599 +▁information -9.89684 +▁wit -9.89688 +▁deck -9.8973 +▁lies -9.8975 +▁paul -9.89839 +▁stars -9.90127 +▁anger -9.90188 +▁strain -9.90201 +▁faces -9.90244 +▁settle -9.90251 +▁adam -9.90281 +▁smith -9.90373 +▁citi -9.90381 +▁importance -9.90385 +▁feather -9.9072 +▁willing -9.90763 +▁served -9.90764 +▁author -9.90817 +▁perceived -9.90847 +▁haven -9.90898 +▁flame -9.90907 +▁divine -9.90945 +▁trail -9.91006 +▁anybody -9.91068 +▁sigh -9.91159 +▁delicate -9.91243 +▁desired -9.91307 +war -9.91329 +▁curiosity -9.91418 +▁practice -9.91418 +▁fold -9.91533 +▁absolutely -9.91541 +▁bottle -9.91607 +▁consideration -9.91616 +▁prop -9.91638 +▁meat -9.91639 +▁choose -9.91768 +▁occupied -9.91768 +▁interested -9.91782 +▁throat -9.91978 +▁candle -9.91985 +▁dawn -9.91996 +cha -9.92028 +▁protect -9.92033 +▁sentence -9.92088 +▁rocks -9.92105 +▁apparently -9.9218 +▁portion -9.92182 +▁aid -9.92242 +▁tight -9.92315 +▁actually -9.92396 +▁presented -9.92442 +▁dying -9.92675 +▁daily -9.92765 +▁political -9.92827 +▁bodies -9.92828 +▁suffered -9.9284 +▁modern -9.92845 +▁completely -9.92895 +▁sooner -9.92933 +▁advance -9.93029 +▁refused -9.93067 +▁farmer -9.93074 +▁polite -9.93183 +▁plate -9.93356 +▁thunder -9.93361 +▁elsie -9.93364 +▁sailor -9.93371 +▁brief -9.93374 +▁suggested -9.93403 +▁anti -9.93442 +▁flesh -9.93541 +▁buck -9.93573 +▁weep -9.93586 +▁dri -9.93665 +▁ocean -9.93719 +▁spend -9.93721 +▁odd -9.9377 +▁governor -9.93809 +well -9.93829 +▁entrance -9.93898 +▁suspicion -9.93898 +▁stepped -9.93935 +▁rapidly -9.93971 +▁check -9.93987 +low -9.94128 +▁club -9.94131 +▁flight -9.94132 +▁hide -9.94165 +▁entire -9.94167 +▁indians -9.94179 +▁sam -9.94213 +▁capital -9.94257 +▁mamma -9.94258 +▁jud -9.94284 +▁correct -9.94437 +▁haste -9.94579 +▁pace -9.9458 +▁crack -9.94583 +▁sensation -9.94619 +▁worst -9.94619 +▁driven -9.94787 +▁midst -9.94797 +▁august -9.94799 +▁proportion -9.94799 +▁innocent -9.94799 +ja -9.94854 +▁doors -9.94913 +▁regarded -9.95005 +▁education -9.95016 +▁employ -9.95052 +▁truly -9.95138 +liness -9.9516 +▁instrument -9.95161 +▁foolish -9.95213 +ility -9.95287 +▁frame -9.95289 +▁taught -9.95343 +▁nay -9.95365 +▁hang -9.95432 +▁argument -9.95525 +▁nineteen -9.95525 +▁elder -9.95574 +og -9.95638 +▁spar -9.95647 +▁papers -9.95683 +▁neighbor -9.957 +▁instruct -9.95708 +▁reward -9.95728 +▁fields -9.95806 +▁equally -9.95809 +▁needed -9.95816 +▁conditions -9.95965 +▁ways -9.95977 +▁request -9.96074 +▁worn -9.96075 +▁dig -9.96135 +▁load -9.96212 +▁remarkable -9.96225 +▁worship -9.96257 +▁park -9.96344 +▁interrupted -9.96393 +▁skill -9.96396 +▁critic -9.96441 +▁distress -9.96442 +▁belief -9.96442 +▁stern -9.9649 +▁track -9.96546 +▁hunting -9.96568 +▁jewel -9.96585 +▁gradually -9.96625 +▁glow -9.96653 +▁mental -9.96704 +▁rushed -9.96737 +▁powers -9.96763 +▁visitor -9.96783 +ight -9.96826 +▁behold -9.96859 +▁ski -9.96872 +▁picked -9.96903 +▁expressed -9.96991 +artagnan -9.96994 +▁moreover -9.96997 +▁keen -9.96998 +▁operation -9.97029 +▁careful -9.97036 +▁hence -9.97131 +▁wander -9.97162 +▁enemies -9.9718 +▁mysterious -9.9718 +▁assert -9.97181 +▁depth -9.97182 +ium -9.97185 +▁prefer -9.97198 +▁charming -9.97301 +▁crossed -9.97306 +▁dread -9.97315 +nnie -9.97438 +▁robin -9.97446 +▁relief -9.97556 +▁inquired -9.9758 +▁apple -9.97602 +▁urge -9.97616 +▁wings -9.97698 +▁choice -9.97737 +▁tre -9.97846 +▁species -9.97924 +▁delighted -9.97997 +▁rapid -9.98035 +▁appeal -9.98111 +▁famous -9.98111 +▁civili -9.98157 +▁helen -9.98168 +▁useful -9.9818 +▁card -9.98181 +▁newspaper -9.98298 +▁plenty -9.98298 +qua -9.98375 +▁bearing -9.98432 +▁nervous -9.98486 +▁rub -9.98727 +▁roar -9.98756 +▁wounded -9.98825 +▁chain -9.98829 +▁produce -9.98919 +▁reflection -9.99014 +▁baron -9.99026 +▁merchant -9.99051 +▁quarrel -9.99051 +▁glory -9.99051 +▁begun -9.99086 +▁queer -9.99244 +▁mix -9.9934 +▁whisper -9.99361 +rg -9.99439 +▁buried -9.9944 +▁bid -9.99446 +▁tip -9.99521 +▁frequently -9.99541 +▁div -9.99601 +▁knee -9.99684 +▁region -9.99813 +ctor -9.99893 +▁root -9.99909 +▁trip -9.99947 +▁jealous -10 +head -10.0005 +▁saved -10.0006 +▁pig -10.0007 +▁phil -10.0019 +▁union -10.0028 +▁ships -10.0029 +▁companions -10.0031 +▁approached -10.0038 +▁harry -10.0038 +▁arrival -10.0038 +▁drunk -10.0038 +▁slept -10.0038 +▁furnish -10.0038 +▁hale -10.0039 +▁para -10.004 +▁heap -10.0047 +▁absence -10.0058 +▁shoes -10.0065 +▁consciousness -10.0067 +▁kindly -10.008 +bel -10.0083 +▁evident -10.0089 +▁lest -10.0095 +▁grasp -10.0104 +▁steal -10.0106 +lon -10.0107 +▁knife -10.0115 +▁precious -10.0115 +▁element -10.0118 +▁proceeded -10.013 +▁fever -10.013 +▁leader -10.0134 +▁risk -10.0137 +▁ease -10.0139 +▁mount -10.0149 +▁meanwhile -10.0154 +▁century -10.0154 +▁grim -10.0155 +▁owe -10.0167 +▁judgment -10.0173 +▁arose -10.0174 +▁vision -10.0176 +▁sang -10.0177 +▁extreme -10.0186 +▁constant -10.0186 +▁asking -10.0188 +▁observation -10.0192 +▁thrust -10.0192 +▁delay -10.0193 +▁hit -10.0211 +▁includ -10.0212 +▁admire -10.0212 +▁lift -10.0219 +▁lesson -10.022 +▁friendship -10.0221 +▁spare -10.0222 +▁issue -10.0223 +▁principal -10.0231 +▁mourn -10.0232 +▁capable -10.0235 +▁burning -10.0241 +▁accepted -10.0242 +▁extraordinary -10.0251 +▁hoped -10.0256 +▁removed -10.0257 +▁horn -10.0261 +▁cent -10.0262 +▁alice -10.0272 +▁chap -10.028 +▁apartment -10.0284 +▁fighting -10.0284 +▁trembling -10.029 +▁somebody -10.029 +▁anyone -10.0291 +▁blame -10.0294 +▁bride -10.0299 +▁reader -10.0304 +▁everywhere -10.031 +▁labour -10.031 +▁recall -10.031 +▁rob -10.0317 +▁bull -10.0324 +▁council -10.0329 +▁popular -10.0329 +▁trial -10.0337 +▁wishes -10.0348 +▁dun -10.0349 +▁assured -10.0349 +▁brilliant -10.0349 +▁forgot -10.035 +▁cab -10.0352 +▁continue -10.0358 +▁acknowledg -10.0369 +▁retreat -10.0369 +▁increased -10.0374 +▁contempt -10.0389 +▁grandfather -10.0389 +▁sympathy -10.0389 +▁ghost -10.0389 +▁creatures -10.0407 +▁ken -10.0408 +▁stretched -10.0409 +▁playing -10.0415 +▁hind -10.0417 +▁members -10.0428 +▁miserable -10.0428 +▁kindness -10.0435 +▁gla -10.0444 +▁highest -10.0447 +aries -10.0457 +▁eighty -10.0467 +▁kissed -10.0468 +▁deserve -10.0468 +▁begged -10.0474 +▁hut -10.0478 +▁closely -10.0485 +▁wondered -10.0499 +▁larger -10.0505 +▁accordingly -10.0508 +▁military -10.0508 +▁remind -10.0508 +▁destroy -10.0527 +▁maintain -10.0528 +▁engine -10.0528 +▁motive -10.0529 +wick -10.0531 +▁strip -10.0543 +ison -10.0544 +▁hans -10.0548 +▁ahead -10.0562 +▁magic -10.0565 +▁infinite -10.0569 +▁prompt -10.0569 +▁informed -10.0571 +▁peer -10.0594 +▁pressed -10.0603 +▁somewhere -10.0609 +▁bought -10.0609 +▁trap -10.0621 +▁scar -10.0623 +▁visible -10.063 +▁ashamed -10.0631 +gar -10.0643 +▁neighbour -10.0649 +▁constitution -10.065 +▁intelligence -10.065 +▁tear -10.0651 +▁profession -10.0655 +▁hungry -10.0661 +▁smell -10.067 +▁listening -10.0671 +▁stories -10.0672 +▁approach -10.0676 +▁aim -10.0681 +▁ham -10.0682 +▁string -10.0684 +▁explanation -10.0691 +▁immense -10.0691 +▁religious -10.0691 +▁hollow -10.0691 +abeth -10.0691 +▁throughout -10.0691 +▁await -10.0691 +▁flying -10.0699 +cum -10.071 +▁scream -10.0711 +▁active -10.0716 +port -10.0718 +ett -10.0729 +▁product -10.0731 +▁unhappy -10.0731 +▁vague -10.0733 +▁stupid -10.0752 +▁dignity -10.0752 +▁isabel -10.0752 +▁pitch -10.0767 +▁comrade -10.0773 +▁reckon -10.0773 +▁stiff -10.0773 +rick -10.0779 +▁spark -10.078 +▁sold -10.0785 +▁stro -10.0806 +▁crying -10.0812 +▁repeat -10.0817 +▁comfortable -10.0831 +▁marked -10.0834 +▁project -10.0835 +▁becoming -10.0835 +▁parents -10.0835 +▁shelter -10.0836 +field -10.0839 +▁nest -10.0841 +▁stole -10.0843 +▁hint -10.0844 +▁trick -10.0849 +▁thoroughly -10.0852 +▁hospital -10.0855 +▁weapon -10.0855 +▁style -10.0856 +▁rome -10.0857 +▁admitted -10.0862 +▁safety -10.0866 +▁understanding -10.0871 +▁weary -10.0872 +▁slaves -10.088 +▁print -10.0886 +▁credit -10.0897 +▁unable -10.0914 +▁clouds -10.0917 +▁conclusion -10.0918 +▁seldom -10.0918 +▁unusual -10.0918 +▁hanging -10.0942 +▁david -10.096 +▁bowed -10.0963 +mond -10.0969 +▁pushed -10.0983 +▁escaped -10.0988 +▁warn -10.099 +▁betray -10.1002 +▁eggs -10.1024 +▁plainly -10.1028 +▁ser -10.1036 +▁exhibit -10.1044 +▁gay -10.1047 +▁display -10.1065 +▁member -10.1066 +▁grin -10.1078 +▁prospect -10.1086 +▁brush -10.1086 +▁waves -10.1087 +▁successful -10.11 +▁extent -10.1108 +▁persuade -10.1129 +▁mood -10.1136 +▁mid -10.1138 +▁arranged -10.115 +▁universal -10.115 +▁jim -10.1153 +▁signal -10.116 +▁whilst -10.1172 +▁wolf -10.1172 +▁philip -10.1173 +▁billy -10.1195 +▁eagerly -10.1196 +▁returning -10.1207 +▁conscience -10.1215 +▁fortunate -10.1215 +▁gleam -10.1215 +▁female -10.1215 +▁hastily -10.1216 +▁provided -10.1218 +▁obtain -10.1221 +▁render -10.1221 +▁instinct -10.1236 +▁concerning -10.1239 +▁concerned -10.1241 +▁rum -10.1247 +▁vol -10.1256 +▁somehow -10.1258 +▁gall -10.1259 +▁pink -10.126 +▁artist -10.1267 +▁accustomed -10.128 +▁unconscious -10.128 +▁advise -10.128 +mmed -10.1283 +▁tiny -10.1288 +▁mud -10.1288 +▁branches -10.1291 +▁refuse -10.1294 +▁rage -10.1295 +▁bishop -10.1301 +▁supply -10.1301 +▁peasant -10.1301 +▁lawyer -10.1302 +▁connection -10.1306 +▁develop -10.1316 +▁correspond -10.1323 +▁rang -10.1325 +house -10.1336 +▁plum -10.1345 +▁nodded -10.1345 +▁slipped -10.1347 +▁kit -10.1349 +▁constantly -10.1352 +▁earl -10.1356 +▁fairly -10.1365 +▁features -10.138 +▁pause -10.1384 +▁painful -10.1388 +▁super -10.1397 +▁laughter -10.1399 +▁whence -10.14 +▁opera -10.1401 +▁joe -10.1402 +▁eating -10.1408 +▁christmas -10.1411 +time -10.1412 +▁wholly -10.1416 +▁apart -10.1418 +▁coach -10.1418 +▁crew -10.143 +▁cheeks -10.1431 +▁revolution -10.1432 +▁lonely -10.1433 +▁attain -10.1433 +▁luc -10.1436 +▁established -10.1437 +▁throne -10.1439 +▁dash -10.144 +▁friendly -10.1443 +▁exhaust -10.1454 +▁cliff -10.1455 +▁reveal -10.1455 +▁adopt -10.1455 +▁centre -10.1457 +▁merry -10.1469 +▁sylvia -10.1477 +▁misfortune -10.1499 +▁feast -10.1499 +▁arab -10.1509 +▁fetch -10.1521 +▁descend -10.153 +ick -10.1531 +▁nut -10.1542 +▁fought -10.1543 +ko -10.1545 +▁setting -10.1558 +▁source -10.1566 +▁persist -10.1566 +▁mercy -10.1571 +▁compare -10.1581 +▁deeply -10.1584 +▁pile -10.1584 +▁attitude -10.1588 +▁delightful -10.1597 +▁endure -10.1602 +▁patience -10.161 +▁local -10.161 +▁victory -10.1615 +▁uttered -10.1622 +▁treated -10.1623 +▁separate -10.1626 +▁dragg -10.1627 +▁beard -10.1643 +▁rear -10.1652 +▁tied -10.1657 +▁title -10.1657 +▁triumph -10.1674 +▁gained -10.1688 +▁defend -10.17 +bury -10.1714 +▁increase -10.1717 +▁bark -10.172 +▁fled -10.1725 +▁pond -10.1728 +▁conquer -10.1746 +▁forehead -10.1746 +▁wag -10.1749 +▁organi -10.1751 +▁anxiety -10.1768 +▁encounter -10.1768 +▁sex -10.1773 +▁sank -10.1779 +▁halt -10.1784 +ella -10.1789 +▁cheek -10.1792 +▁writer -10.1793 +chi -10.1796 +▁employed -10.1805 +▁humble -10.1806 +▁raise -10.181 +▁troops -10.1814 +▁distinguished -10.1816 +▁giant -10.1821 +▁sink -10.1822 +▁flag -10.1826 +car -10.1826 +▁obtained -10.183 +▁discovery -10.1836 +▁national -10.1842 +▁jumped -10.1842 +▁commission -10.1859 +▁positive -10.1859 +▁loving -10.186 +▁exact -10.1861 +▁ideal -10.1862 +▁range -10.1864 +▁refer -10.1874 +▁murmured -10.1877 +▁encourage -10.1882 +▁college -10.1882 +▁novel -10.1884 +worth -10.1892 +▁mortal -10.1906 +▁fan -10.1914 +▁rolled -10.1915 +▁guilty -10.1918 +▁victor -10.1926 +▁approaching -10.1945 +▁relative -10.1952 +▁estate -10.1952 +▁ugly -10.1952 +▁metal -10.1967 +▁dared -10.1969 +▁boots -10.1969 +▁robert -10.1976 +▁clock -10.198 +▁admiration -10.1998 +▁fourteen -10.1998 +▁witch -10.1999 +▁barbar -10.2001 +▁pra -10.2017 +▁cake -10.2022 +▁shone -10.2025 +▁managed -10.2031 +▁volume -10.2045 +▁greek -10.2045 +▁dancing -10.2045 +j -10.2055 +▁wretched -10.2055 +▁condemn -10.2068 +▁magnificent -10.2068 +▁consult -10.2068 +▁fleet -10.2083 +▁arrangement -10.2092 +▁incident -10.2092 +▁misery -10.2092 +▁arrow -10.2094 +▁stroke -10.2099 +▁assist -10.21 +▁succeed -10.2108 +▁recent -10.2109 +▁build -10.211 +▁desperate -10.2115 +▁widow -10.2115 +▁market -10.2129 +fall -10.213 +▁wisdom -10.2139 +▁current -10.2139 +▁spoil -10.2139 +▁resist -10.2161 +▁obvious -10.2163 +▁sensible -10.2163 +▁wooden -10.2166 +▁addressed -10.2184 +▁bade -10.2185 +▁counsel -10.2186 +▁select -10.2186 +▁purchase -10.2186 +▁useless -10.2187 +▁fin -10.2195 +▁bringing -10.2207 +▁arrest -10.221 +▁stared -10.2212 +▁poison -10.2213 +▁gil -10.2214 +▁swallow -10.2234 +▁anna -10.2234 +rate -10.2234 +▁slid -10.2236 +▁block -10.2237 +▁sport -10.2242 +▁ninety -10.2245 +▁provide -10.2255 +▁lamb -10.2259 +▁interval -10.226 +▁described -10.228 +▁provision -10.2282 +▁striking -10.2282 +▁proposed -10.2285 +▁jump -10.2287 +▁suggest -10.2303 +▁melancholy -10.2306 +▁warrior -10.2306 +▁burden -10.2308 +▁departure -10.2309 +▁limb -10.2316 +▁troubled -10.2325 +▁meadow -10.233 +▁sacred -10.233 +▁straw -10.233 +▁tru -10.2332 +▁solid -10.2334 +▁soil -10.2348 +▁lucy -10.2348 +▁civil -10.2348 +▁recover -10.2348 +▁energy -10.2354 +▁powder -10.2354 +▁resumed -10.2354 +▁intense -10.2354 +▁british -10.2378 +▁agreeable -10.2389 +▁trot -10.2393 +▁everyone -10.2393 +▁concern -10.2394 +▁voyage -10.2402 +▁southern -10.2402 +▁bosom -10.2406 +▁utterly -10.2424 +▁essential -10.2426 +▁feed -10.2427 +▁household -10.243 +▁extremely -10.2434 +▁wondering -10.2435 +▁list -10.2446 +▁experiment -10.2451 +▁joseph -10.2451 +▁mystery -10.2451 +▁restore -10.2455 +▁blush -10.2456 +fold -10.2459 +▁lap -10.2464 +▁chosen -10.2471 +▁epi -10.2472 +▁intellect -10.2475 +▁curtain -10.2475 +ology -10.2475 +▁pine -10.2477 +▁mounted -10.2481 +har -10.249 +▁punish -10.2492 +▁drift -10.2502 +▁wedding -10.2506 +▁ko -10.2508 +▁preparation -10.2524 +▁resolution -10.2524 +▁oppress -10.2524 +▁fix -10.2535 +▁sch -10.2548 +▁victim -10.2549 +▁summon -10.2549 +▁julia -10.2549 +▁flood -10.2551 +▁slightly -10.257 +▁lodge -10.2578 +▁unexpected -10.2598 +▁confusion -10.2598 +▁addition -10.2598 +▁conceive -10.2598 +▁jesus -10.2599 +▁wire -10.2608 +long -10.2615 +▁rude -10.2624 +▁fatal -10.2627 +▁patch -10.2629 +▁careless -10.2629 +▁vari -10.2635 +▁wal -10.2643 +▁catherine -10.2647 +▁parliament -10.2647 +▁profound -10.2647 +▁aloud -10.2648 +▁relieve -10.2649 +▁push -10.266 +▁accompanied -10.2672 +▁sovereign -10.2672 +▁singular -10.2672 +▁composed -10.2672 +▁assistance -10.2676 +▁echo -10.2678 +▁shaking -10.2679 +▁teacher -10.2684 +▁horrible -10.2697 +▁strict -10.2697 +▁gown -10.2703 +▁punishment -10.2704 +▁verse -10.2712 +atory -10.2712 +▁mistaken -10.2716 +▁swept -10.2722 +▁gesture -10.2722 +▁steel -10.2724 +▁bush -10.2735 +▁affected -10.2739 +▁directed -10.2745 +▁absurd -10.2747 +▁surrounded -10.2747 +▁scrap -10.2749 +▁sugar -10.2749 +▁immediate -10.2753 +▁saddle -10.2753 +▁sighed -10.2768 +▁govern -10.2768 +▁pea -10.2769 +▁snap -10.2769 +▁arise -10.277 +▁exchange -10.2772 +▁impatient -10.2772 +▁whip -10.2794 +▁stretch -10.2797 +▁embrace -10.2798 +▁disease -10.2798 +▁profit -10.2798 +▁riding -10.2802 +▁recovered -10.2803 +▁convinced -10.2814 +▁leaning -10.2815 +▁domestic -10.2823 +▁complex -10.2823 +▁manifest -10.2823 +▁indulge -10.2823 +▁genius -10.2824 +▁agent -10.2841 +▁veil -10.2841 +▁description -10.2848 +▁inclined -10.2848 +▁deceive -10.2848 +▁mac -10.2851 +▁darling -10.2861 +▁reign -10.2866 +▁enormous -10.2874 +▁restrain -10.2874 +▁duties -10.2876 +▁enable -10.2899 +ttered -10.2902 +▁pole -10.2906 +▁exception -10.292 +▁intimate -10.2925 +▁countess -10.2927 +▁tribe -10.2931 +▁oil -10.2938 +cast -10.2944 +▁handkerchief -10.295 +▁midnight -10.295 +▁problem -10.295 +▁reli -10.2951 +▁unre -10.2952 +▁crush -10.2959 +▁discuss -10.296 +▁tramp -10.296 +▁whirl -10.2977 +▁hori -10.2985 +hin -10.2992 +▁official -10.3001 +▁drown -10.3002 +▁pierre -10.3002 +▁scheme -10.3002 +▁locked -10.3006 +▁permitted -10.3007 +▁carr -10.3007 +▁connected -10.3008 +▁assure -10.3015 +▁cock -10.3018 +▁utmost -10.3027 +▁devoted -10.3027 +▁sufficiently -10.3036 +ulation -10.304 +▁intellectual -10.3053 +▁carpet -10.3053 +▁objection -10.3062 +▁afterward -10.3067 +▁reality -10.3067 +cho -10.3068 +gate -10.3074 +▁negro -10.3079 +▁retain -10.3079 +▁ascend -10.3079 +▁cease -10.308 +▁marvel -10.3081 +most -10.3086 +▁bond -10.3092 +▁kate -10.3101 +▁breaking -10.3104 +▁coal -10.3105 +▁ignorant -10.3106 +▁twin -10.3109 +▁astonishment -10.3131 +▁coffee -10.3131 +▁execut -10.3146 +▁origin -10.3147 +▁final -10.3151 +▁inhabitants -10.3157 +▁stable -10.3164 +▁parties -10.3169 +▁cities -10.3169 +▁generous -10.3183 +▁describe -10.3185 +▁jar -10.3187 +▁plunge -10.3192 +▁announced -10.3202 +▁merit -10.3207 +▁ere -10.3222 +▁disappoint -10.3228 +▁suggestion -10.3233 +▁doubtless -10.3234 +▁trunk -10.3236 +▁job -10.3253 +▁stamp -10.3257 +▁divided -10.3258 +▁appointed -10.3259 +▁acquainted -10.3262 +▁absolute -10.327 +▁fearful -10.3279 +▁privilege -10.3289 +▁steep -10.3291 +▁vote -10.3291 +▁craft -10.3296 +▁hunter -10.3296 +▁modest -10.3303 +▁forbid -10.3305 +▁endeavour -10.3315 +▁sweep -10.3315 +▁beheld -10.3315 +acious -10.332 +▁absorb -10.3342 +▁construct -10.3342 +▁expedition -10.3342 +▁empire -10.3342 +▁erect -10.3343 +▁offend -10.3344 +▁intend -10.3351 +▁chin -10.3356 +▁permit -10.3363 +▁contract -10.3368 +▁thirst -10.3369 +▁destroyed -10.337 +▁ger -10.3375 +▁wagon -10.3378 +▁gloom -10.3393 +▁atmosphere -10.3395 +▁reserve -10.3395 +lock -10.3412 +▁nonsense -10.3422 +▁prevail -10.3422 +▁quality -10.3422 +▁clasp -10.3422 +▁concluded -10.3426 +▁katy -10.3433 +▁eternal -10.3449 +▁neglect -10.3449 +▁creep -10.345 +▁squire -10.345 +▁muttered -10.3452 +▁electric -10.3452 +▁hay -10.3456 +▁expense -10.3476 +▁scorn -10.3476 +▁retired -10.3476 +▁murmur -10.3482 +▁stout -10.3484 +▁sharply -10.35 +▁district -10.3503 +▁leaf -10.3503 +▁failure -10.3507 +▁numerous -10.353 +▁infant -10.3531 +▁traveller -10.3535 +▁crep -10.354 +▁june -10.3547 +work -10.3547 +▁hunger -10.3548 +▁recommend -10.3557 +▁jean -10.3562 +▁richard -10.3571 +▁monte -10.3588 +▁preach -10.3593 +▁palm -10.3594 +▁tap -10.36 +▁anywhere -10.3612 +▁disposition -10.3612 +▁mirror -10.3612 +▁venture -10.3616 +▁pound -10.3638 +▁cigar -10.3639 +▁invited -10.364 +▁bench -10.3645 +▁protection -10.3653 +▁benefit -10.3667 +▁thomas -10.3667 +▁reproach -10.3694 +▁clerk -10.3694 +hu -10.3707 +▁uniform -10.3722 +▁generation -10.3722 +▁compass -10.3722 +▁warning -10.3723 +▁extended -10.3728 +▁difficulties -10.3731 +▁affect -10.374 +▁maybe -10.3741 +▁comb -10.3743 +▁seal -10.3743 +▁groan -10.3743 +▁western -10.3751 +▁chop -10.3753 +▁earn -10.3756 +▁score -10.3758 +▁idle -10.3761 +▁astonished -10.3777 +▁introduced -10.3777 +▁lieutenant -10.3777 +▁leisure -10.3777 +▁violence -10.3777 +▁firmly -10.3778 +▁monster -10.3784 +▁properly -10.3785 +▁rendered -10.3797 +▁twist -10.3805 +▁pirate -10.3807 +▁batter -10.3808 +▁robber -10.3809 +▁wept -10.3815 +▁descended -10.3821 +▁throwing -10.3822 +▁leaned -10.3823 +▁ornament -10.3834 +▁andrew -10.3839 +▁capture -10.3841 +▁bushes -10.3852 +▁republic -10.3861 +▁confident -10.3862 +▁lean -10.3902 +▁date -10.3904 +▁counter -10.3909 +▁northern -10.3918 +▁pearl -10.3924 +▁nearest -10.3933 +▁francis -10.3946 +▁wandering -10.3948 +▁frequent -10.3957 +▁startled -10.3961 +▁statement -10.3965 +▁occur -10.3971 +▁bloom -10.3974 +▁nerve -10.3974 +▁induce -10.3978 +▁flatter -10.3984 +▁ambition -10.4002 +▁madam -10.4005 +▁monk -10.4018 +▁rent -10.4023 +▁investigat -10.4031 +▁rabbit -10.4031 +▁confirm -10.4031 +▁regiment -10.4031 +▁submit -10.4031 +▁spell -10.4032 +▁eva -10.4033 +▁slope -10.4036 +▁furious -10.4037 +▁bestow -10.4047 +▁rail -10.4057 +▁ralph -10.4059 +▁compelled -10.4059 +▁thread -10.4059 +▁scattered -10.406 +▁deny -10.4067 +▁curl -10.4068 +▁chill -10.4075 +▁pronounc -10.4088 +▁mankind -10.4088 +▁cattle -10.4091 +▁male -10.4097 +▁execution -10.41 +▁tide -10.4115 +▁supreme -10.4117 +▁valuable -10.4117 +▁likewise -10.4117 +▁convey -10.4117 +▁gloomy -10.4119 +▁coin -10.4122 +▁actual -10.4129 +▁fog -10.4136 +▁tax -10.4139 +▁province -10.4146 +▁grateful -10.4146 +▁spiritual -10.4146 +▁vanished -10.4146 +▁diana -10.4146 +▁haunt -10.4146 +▁dragon -10.4151 +▁crawl -10.4153 +▁neat -10.4154 +▁china -10.4171 +▁gratitude -10.4174 +▁gasp -10.4179 +▁irre -10.419 +▁finish -10.4193 +▁intent -10.4198 +▁fright -10.4202 +▁embarrass -10.4203 +▁thirteen -10.4203 +▁ruth -10.4209 +▁slightest -10.4212 +▁development -10.4213 +▁interview -10.4233 +▁spectacle -10.4233 +▁brook -10.4233 +▁weakness -10.4255 +▁audience -10.4262 +▁consequently -10.4262 +▁abroad -10.4262 +▁release -10.4262 +▁aspect -10.4263 +▁painted -10.4263 +▁insult -10.4263 +▁sooth -10.4269 +▁disappointment -10.427 +▁emerg -10.4271 +▁brig -10.4284 +▁esteem -10.4291 +▁publish -10.4291 +▁passenger -10.4291 +▁invitation -10.4291 +▁piano -10.4291 +▁irish -10.4295 +▁desk -10.4297 +▁beaten -10.4318 +▁fifth -10.432 +▁impulse -10.432 +▁swear -10.432 +▁purple -10.4322 +▁committed -10.4324 +▁countries -10.4327 +▁perceive -10.4328 +▁eaten -10.4329 +▁celebrat -10.435 +▁grandmother -10.435 +▁shudder -10.435 +▁spanish -10.435 +▁sunshine -10.435 +▁hitherto -10.4352 +▁amid -10.4366 +▁mock -10.4378 +▁marilla -10.4379 +▁snake -10.4379 +▁interfere -10.4381 +▁walter -10.4385 +▁marble -10.4388 +terior -10.4394 +▁mission -10.4399 +▁boot -10.4407 +▁furniture -10.4409 +▁driving -10.4409 +▁steady -10.4409 +stead -10.4414 +▁circumstance -10.4417 +▁interpret -10.4438 +▁enchant -10.4438 +▁error -10.4439 +▁conviction -10.4449 +▁helpless -10.445 +▁qualities -10.4468 +▁medicine -10.4468 +▁italian -10.447 +▁hastened -10.4472 +▁occasionally -10.4474 +▁pursued -10.4475 +ux -10.4475 +▁hesitated -10.4493 +▁chase -10.4496 +▁independent -10.4498 +▁oliver -10.4498 +▁linger -10.4503 +▁examined -10.4508 +▁repent -10.4521 +▁physician -10.4528 +▁beloved -10.4558 +▁attached -10.4558 +▁florence -10.4558 +▁honey -10.4565 +▁mouse -10.4569 +▁cries -10.457 +▁poem -10.4573 +▁ram -10.4588 +▁destruction -10.4588 +▁messenger -10.4588 +▁tristram -10.4588 +▁fulfil -10.4588 +▁fancied -10.4588 +▁excess -10.4588 +▁bake -10.4604 +mont -10.4613 +▁thornton -10.4618 +▁quantity -10.4618 +▁wh -10.4628 +▁created -10.4633 +▁curse -10.4637 +▁continually -10.4638 +▁lightning -10.4642 +▁borne -10.4669 +▁mild -10.4673 +ttle -10.4677 +▁disposed -10.4679 +▁rifle -10.4679 +▁polly -10.468 +▁goat -10.4682 +▁total -10.4686 +▁virginia -10.4689 +▁backward -10.469 +▁peril -10.469 +▁kick -10.4691 +▁quo -10.4702 +▁glorious -10.471 +▁multitude -10.471 +▁leather -10.471 +▁absent -10.471 +▁demon -10.4711 +▁torture -10.4711 +▁debt -10.4712 +▁accord -10.4725 +▁catholic -10.474 +▁pill -10.475 +▁flour -10.4764 +▁library -10.4771 +▁pursuit -10.4771 +▁shirt -10.4771 +▁dearest -10.4772 +▁collar -10.4773 +▁declare -10.4781 +▁tempt -10.4784 +▁branch -10.4785 +▁steadily -10.4802 +▁disgust -10.4802 +▁silly -10.4803 +▁robe -10.481 +▁arrive -10.4812 +▁drank -10.4832 +▁communicat -10.4847 +▁mate -10.485 +▁rachel -10.4863 +▁washington -10.4863 +▁resign -10.4864 +▁meantime -10.4867 +▁engagement -10.4869 +▁separated -10.4872 +▁quiver -10.4872 +▁discussion -10.4882 +▁ventured -10.489 +▁nail -10.4894 +▁surrounding -10.4894 +▁polish -10.4895 +▁lace -10.4896 +▁swell -10.4906 +▁lincoln -10.4926 +▁student -10.4926 +▁glitter -10.4926 +▁joke -10.4931 +▁russian -10.4941 +▁readily -10.4943 +▁poverty -10.4957 +▁disgrace -10.4957 +▁heavily -10.4957 +▁cheese -10.4957 +▁staff -10.4984 +▁entreat -10.4988 +▁farewell -10.4988 +▁lunch -10.4988 +▁peep -10.4989 +▁someone -10.4997 +▁chris -10.5008 +▁disappear -10.5012 +▁decision -10.502 +▁pistol -10.502 +▁spur -10.5021 +▁assumed -10.5027 +▁extend -10.5044 +▁definite -10.5051 +▁enthusiasm -10.5051 +▁undertake -10.5052 +▁committee -10.5083 +▁simon -10.5083 +▁scale -10.5094 +▁applied -10.5115 +▁fence -10.5115 +▁related -10.5117 +▁vice -10.5129 +▁unpleasant -10.5146 +▁probable -10.5146 +▁procure -10.5147 +▁frown -10.515 +istic -10.5168 +▁cloak -10.5182 +▁humanity -10.5191 +▁dwarf -10.521 +▁families -10.521 +▁philosopher -10.521 +▁overcome -10.521 +▁defeat -10.5211 +▁plac -10.5215 +▁fastened -10.5217 +▁tomb -10.5219 +▁classes -10.5236 +▁marsh -10.5239 +▁gracious -10.5243 +▁remote -10.5243 +▁cell -10.5247 +▁shriek -10.5275 +▁rescue -10.5276 +▁chose -10.5281 +▁pool -10.529 +▁slo -10.5298 +▁cutting -10.5301 +▁coward -10.5307 +▁dirty -10.5307 +▁border -10.5307 +▁hook -10.5308 +▁monkey -10.5308 +▁chuck -10.5311 +▁weigh -10.5321 +▁emily -10.5325 +▁jest -10.5328 +▁mule -10.5328 +▁associate -10.534 +▁glimpse -10.534 +▁stuck -10.534 +▁bolt -10.5369 +▁murderer -10.538 +▁pony -10.5385 +▁rattl -10.5401 +▁distinguish -10.5401 +▁institution -10.5405 +▁cunning -10.5405 +▁compliment -10.5405 +▁spin -10.5406 +▁appetite -10.5438 +▁reputation -10.5438 +▁feeble -10.5438 +▁series -10.5452 +▁graceful -10.5457 +▁phrase -10.5471 +▁platform -10.5471 +▁clay -10.5481 +▁opposition -10.5504 +▁boast -10.5505 +▁lane -10.551 +▁growth -10.5527 +▁inclination -10.5537 +▁behave -10.5537 +▁susan -10.5538 +▁dislike -10.5543 +▁distinction -10.5545 +▁illustrat -10.557 +▁nicholas -10.557 +▁satisfy -10.557 +▁drama -10.557 +▁elbow -10.557 +▁consum -10.5571 +▁oath -10.5586 +▁channel -10.5603 +▁spear -10.5603 +▁slain -10.5603 +▁characteristic -10.5605 +▁sauce -10.5609 +▁frog -10.5629 +▁conception -10.5637 +▁timid -10.5637 +▁apparent -10.5659 +▁center -10.567 +▁variety -10.567 +▁dusk -10.5679 +shire -10.5689 +▁apt -10.5693 +▁column -10.5704 +▁revenge -10.5704 +▁rival -10.571 +▁imitat -10.571 +▁passionate -10.5716 +▁selfish -10.5721 +▁norman -10.5725 +▁extra -10.5737 +▁repair -10.5738 +▁thrill -10.5738 +▁treatment -10.5747 +▁rosa -10.575 +▁organ -10.5768 +▁martin -10.5771 +▁indifferent -10.5772 +▁thither -10.5772 +▁pepper -10.5772 +▁gallant -10.5776 +▁recollect -10.5784 +▁scarce -10.5804 +▁trembled -10.5804 +▁shield -10.5806 +▁mingled -10.5806 +▁brick -10.5829 +▁harsh -10.583 +▁humor -10.5838 +▁mischief -10.584 +▁tremendous -10.584 +▁function -10.584 +▁smart -10.584 +▁sultan -10.5874 +▁dismiss -10.5874 +▁threatened -10.5875 +ji -10.5876 +▁cheap -10.5878 +▁vine -10.5878 +▁flock -10.5898 +▁endeavor -10.5908 +▁italy -10.5912 +▁flutter -10.5913 +▁whisk -10.5916 +▁waist -10.5922 +▁monarch -10.5943 +▁smoking -10.5943 +▁africa -10.5943 +▁accuse -10.5943 +▁herbert -10.5946 +▁refresh -10.5977 +▁rejoice -10.5977 +▁pillow -10.5979 +▁hopeless -10.5989 +▁poetry -10.5991 +▁perish -10.6007 +▁philosophy -10.6012 +▁bernard -10.6012 +▁whistle -10.6013 +▁lament -10.6014 +▁expectation -10.6028 +▁improve -10.6034 +▁fountain -10.6047 +▁perplex -10.6047 +▁despise -10.6047 +▁league -10.6047 +▁narrat -10.6047 +▁ignorance -10.6049 +▁reference -10.6051 +▁sunk -10.6052 +sail -10.6055 +▁wip -10.6057 +▁duck -10.6068 +▁partner -10.6076 +▁grove -10.6081 +▁prophet -10.6082 +▁shiver -10.6083 +▁neighbourhood -10.6083 +▁purse -10.6084 +▁representative -10.6084 +▁precisely -10.6104 +▁angle -10.6115 +▁acquired -10.6117 +▁chimney -10.6117 +▁doctrine -10.6117 +▁maxim -10.6117 +▁majority -10.6132 +▁autumn -10.6152 +▁cristo -10.6152 +▁disguise -10.6152 +▁achieve -10.6152 +▁confused -10.6152 +▁reduced -10.6152 +▁earlier -10.6155 +▁theatre -10.616 +▁decide -10.6172 +ological -10.6188 +▁continent -10.6188 +▁occupation -10.6188 +▁vigorous -10.6188 +▁decline -10.6188 +▁community -10.6193 +▁motionless -10.6198 +▁hatred -10.6205 +▁communication -10.6206 +▁determin -10.6218 +▁comment -10.6223 +▁approve -10.6223 +▁ceremony -10.6223 +▁criminal -10.6223 +▁scientific -10.6223 +▁duchess -10.6223 +▁vivid -10.6223 +▁shift -10.6223 +▁avail -10.6224 +▁bowl -10.6234 +▁johnson -10.6241 +▁contrast -10.6259 +▁slender -10.6259 +▁amusement -10.6259 +▁plot -10.6259 +▁damp -10.6261 +▁association -10.6294 +▁uncertain -10.6294 +▁snatch -10.6294 +▁pressure -10.6299 +▁apply -10.6306 +▁restless -10.6311 +▁perch -10.6315 +▁notwithstanding -10.633 +▁swung -10.633 +▁planet -10.633 +▁stirred -10.6337 +▁attendant -10.634 +▁thro -10.6354 +▁enjoyment -10.6364 +▁worry -10.6366 +▁albert -10.6366 +▁naked -10.6367 +▁talent -10.6372 +▁marian -10.6387 +▁reform -10.639 +▁lyn -10.6402 +▁deliberate -10.6402 +▁intelligent -10.6402 +▁sensitive -10.6402 +▁yonder -10.6402 +▁pupil -10.6402 +▁frightful -10.6409 +▁doubtful -10.6411 +▁standard -10.6423 +▁deposit -10.6439 +▁magistrate -10.6439 +▁shepherd -10.6439 +▁stomach -10.6439 +▁renew -10.6439 +▁hedge -10.6458 +▁possibility -10.6475 +▁fatigue -10.6475 +▁francs -10.6475 +▁portrait -10.6475 +▁resemble -10.6475 +▁favorite -10.6477 +▁cream -10.6491 +▁pope -10.651 +▁secretary -10.6524 +▁divers -10.6526 +▁activity -10.6548 +▁speculat -10.6548 +▁humour -10.6553 +▁fitted -10.6575 +▁external -10.6585 +▁cetera -10.6585 +▁wrapped -10.6586 +▁jaw -10.6612 +▁fred -10.6615 +▁examination -10.6622 +▁lodging -10.6622 +▁crow -10.6623 +▁owing -10.6625 +▁balance -10.6631 +▁puff -10.6644 +▁tenderness -10.6648 +▁porthos -10.6659 +▁anchor -10.666 +▁interrupt -10.6668 +▁driver -10.6689 +▁necessarily -10.6696 +▁perpetual -10.6696 +▁agony -10.6703 +▁scholar -10.6733 +▁scotland -10.6733 +▁suppress -10.6733 +▁wrath -10.6733 +▁wreck -10.6733 +▁exceed -10.6734 +▁perfection -10.6758 +▁doorway -10.6765 +▁india -10.6766 +▁clergy -10.6771 +▁tradition -10.6771 +▁section -10.6771 +▁eastern -10.6771 +▁wives -10.6774 +▁convention -10.6779 +▁announc -10.6782 +▁egypt -10.6797 +▁contradict -10.6808 +▁scratch -10.6808 +▁glove -10.6808 +▁central -10.6808 +▁wax -10.6826 +ifying -10.6831 +▁prepare -10.6833 +▁accompany -10.6846 +▁increasing -10.6846 +▁liberal -10.6846 +▁raising -10.6846 +▁orange -10.6847 +▁shoe -10.687 +▁attribute -10.6884 +▁literature -10.6884 +▁withdraw -10.6884 +▁hawk -10.6885 +thorpe -10.6886 +▁whither -10.6887 +▁moonlight -10.6887 +▁examine -10.6909 +▁happily -10.6922 +▁precede -10.6925 +▁detective -10.6927 +▁inches -10.6927 +▁solitary -10.696 +▁dutch -10.696 +▁napoleon -10.6998 +▁uneasy -10.6998 +▁cardinal -10.6998 +▁blew -10.6999 +▁fowl -10.6999 +▁decorat -10.6999 +▁childhood -10.7009 +▁torment -10.7012 +▁scent -10.7016 +▁losing -10.7024 +▁permission -10.7037 +▁blank -10.707 +▁upstairs -10.7075 +▁capacity -10.7075 +▁trifle -10.7076 +▁folly -10.7076 +▁remove -10.7102 +▁vengeance -10.7114 +▁enterprise -10.7114 +▁bedroom -10.7114 +▁anyhow -10.7114 +▁inquiry -10.7115 +▁ashes -10.714 +▁hush -10.7148 +▁awkward -10.7153 +▁saturday -10.7153 +▁genuine -10.7153 +▁surviv -10.7154 +▁drag -10.7156 +▁skirt -10.7156 +▁affectionate -10.7163 +▁tang -10.7179 +▁mutual -10.7192 +▁dispute -10.7192 +▁eagle -10.7192 +▁income -10.7193 +▁bind -10.7201 +▁wilt -10.7204 +▁fame -10.7206 +▁improvement -10.7208 +▁differ -10.7224 +▁awoke -10.7231 +▁sleeve -10.7231 +▁solitude -10.7231 +▁favourite -10.7234 +▁detect -10.7266 +▁comprehend -10.7271 +▁preparing -10.7271 +▁serpent -10.7271 +▁summit -10.7271 +▁knot -10.7271 +▁knit -10.7271 +▁copy -10.7271 +▁woe -10.7273 +▁stopping -10.7274 +▁faded -10.7274 +▁hideous -10.7279 +▁julie -10.7279 +▁shine -10.7306 +▁axe -10.731 +▁conflict -10.731 +▁proposition -10.731 +▁refuge -10.731 +▁gallery -10.731 +▁bundle -10.7311 +▁slavery -10.7324 +▁mask -10.733 +▁alyosha -10.735 +▁ladder -10.7359 +▁department -10.737 +▁discharge -10.739 +▁depress -10.739 +▁scarlet -10.7392 +▁gallop -10.7394 +▁kitty -10.7397 +▁paw -10.7403 +▁receiving -10.743 +▁surrender -10.743 +▁sustain -10.743 +▁twilight -10.743 +▁congress -10.743 +▁ireland -10.7431 +▁funny -10.7435 +▁lend -10.7459 +▁constitute -10.747 +▁crystal -10.747 +▁lofty -10.747 +▁funeral -10.747 +▁spain -10.747 +▁exceedingly -10.747 +▁damn -10.7473 +▁commun -10.7503 +▁prejudice -10.751 +▁porch -10.7511 +▁assistant -10.7515 +▁today -10.7521 +▁smot -10.7543 +▁enclos -10.7545 +▁industry -10.7551 +▁defence -10.7551 +▁hither -10.7554 +▁coloni -10.7567 +▁marguerite -10.7591 +▁miracle -10.7591 +▁inherit -10.7592 +▁beggar -10.7594 +▁unlike -10.7613 +▁envelope -10.7632 +▁indignation -10.7632 +▁natasha -10.7632 +▁proposal -10.7632 +▁fragment -10.7632 +▁roast -10.7634 +▁roused -10.7635 +encies -10.7651 +▁commenced -10.7673 +▁resource -10.7673 +▁population -10.7673 +▁quoth -10.7683 +▁tumble -10.7702 +▁pursue -10.7705 +▁educat -10.7706 +▁afflict -10.7714 +▁contact -10.7714 +▁crimson -10.7714 +▁division -10.7714 +▁disorder -10.7714 +▁copper -10.7715 +▁moderate -10.7716 +▁drum -10.772 +▁swim -10.7727 +▁salute -10.7732 +▁assume -10.7746 +▁nav -10.7747 +▁emphasi -10.7756 +▁overwhelm -10.7756 +▁shakespeare -10.7756 +▁struggling -10.7756 +▁tranquil -10.7756 +▁muscle -10.7756 +▁chicken -10.7756 +▁tread -10.7761 +▁claw -10.7764 +▁solicit -10.7766 +▁bible -10.778 +▁threat -10.7796 +▁velvet -10.7797 +▁exposed -10.7797 +▁idiot -10.7797 +▁barrel -10.7798 +▁ripe -10.7799 +▁penny -10.7809 +▁temptation -10.7822 +▁danglars -10.7839 +mbled -10.7841 +keep -10.7867 +▁chu -10.787 +▁centuries -10.7881 +▁distribut -10.7881 +▁reject -10.7881 +▁retorted -10.7881 +▁concentrat -10.7881 +▁cordial -10.7881 +▁motor -10.7882 +▁cannon -10.7884 +▁wretch -10.7905 +▁assurance -10.7923 +▁thief -10.7923 +▁survey -10.7923 +▁railway -10.7925 +▁vital -10.7925 +▁jackson -10.7933 +▁combat -10.7935 +▁recollection -10.7949 +▁security -10.7965 +▁nancy -10.7965 +▁jacob -10.7965 +▁clutch -10.7965 +▁growl -10.797 +▁blanket -10.7971 +▁cellar -10.7973 +▁indignant -10.8007 +▁convenient -10.8007 +▁worm -10.8008 +▁screen -10.8008 +▁coarse -10.8008 +▁transport -10.801 +▁determination -10.8019 +▁bullet -10.8019 +▁appreciate -10.805 +▁invisible -10.805 +▁devotion -10.805 +▁mixture -10.805 +▁candid -10.8051 +▁performance -10.8059 +▁rebel -10.8078 +▁exquisite -10.8093 +▁bargain -10.8093 +▁tobacco -10.8093 +▁loyal -10.8094 +▁mould -10.8094 +▁attentive -10.8135 +▁dorothy -10.8135 +▁brute -10.8136 +▁establishment -10.8145 +▁glen -10.8163 +▁inhabit -10.8179 +▁obscure -10.8179 +▁borrow -10.8179 +▁essence -10.8179 +▁dismay -10.8179 +hurst -10.8185 +▁vow -10.8195 +▁flee -10.82 +▁pluck -10.8222 +▁coffin -10.8222 +▁sunset -10.8224 +▁stephen -10.8226 +▁blade -10.8228 +▁holiday -10.8265 +▁mechanical -10.8265 +▁cotton -10.8266 +▁awakened -10.827 +hold -10.8309 +▁ridiculous -10.8309 +▁hesitation -10.8309 +▁corpse -10.8309 +▁saving -10.831 +▁sancho -10.831 +foot -10.8316 +▁eldest -10.8353 +▁peak -10.8374 +▁despite -10.8397 +▁edith -10.8397 +▁wilson -10.8397 +▁cherish -10.8397 +▁resistance -10.8403 +▁argue -10.8405 +▁inquire -10.8437 +▁apprehension -10.8441 +▁avenue -10.8441 +▁drake -10.8441 +▁propose -10.8446 +▁inferior -10.8486 +▁staircase -10.8486 +▁wherefore -10.8486 +▁carlyle -10.8486 +▁couch -10.8496 +▁route -10.8504 +▁politics -10.853 +▁tomorrow -10.853 +▁confined -10.8531 +▁naught -10.8531 +▁throng -10.8533 +▁sunlight -10.854 +▁imperfect -10.8575 +▁indifference -10.8575 +▁obedience -10.8575 +▁reception -10.8575 +▁turkey -10.8575 +▁vegetable -10.8575 +▁residence -10.8575 +▁violet -10.8575 +▁sarah -10.8575 +▁altar -10.8577 +▁grieve -10.8579 +▁jerk -10.8587 +▁magician -10.8589 +▁ensu -10.8609 +▁blossom -10.862 +▁lantern -10.862 +▁resolute -10.862 +▁thoughtfully -10.8621 +▁fortnight -10.8665 +▁trumpet -10.8665 +▁unwilling -10.8665 +▁valjean -10.8665 +▁lecture -10.8665 +▁whereupon -10.8665 +▁holland -10.8665 +▁creek -10.8666 +▁changing -10.8666 +▁slice -10.8666 +▁accent -10.8667 +▁normal -10.8667 +▁disagreeable -10.8711 +▁frederick -10.8711 +▁rubbed -10.8711 +▁dumb -10.8711 +▁establish -10.8736 +▁import -10.8754 +▁affirm -10.8757 +▁matthew -10.8757 +▁bunch -10.8757 +▁hoping -10.8758 +▁convert -10.8759 +▁brisk -10.8759 +▁bending -10.8763 +▁michael -10.8802 +▁mademoiselle -10.8802 +▁easier -10.8802 +▁facing -10.8803 +▁jones -10.8804 +▁excellency -10.8848 +▁literary -10.8849 +▁gossip -10.8849 +▁devour -10.8849 +▁stagger -10.8849 +▁pencil -10.8849 +▁average -10.8849 +▁hammer -10.8851 +▁triumphant -10.8855 +▁preferred -10.8855 +burn -10.8877 +▁application -10.8895 +▁occupy -10.8895 +▁authorities -10.8898 +▁ascertain -10.8941 +▁corridor -10.8941 +▁delicious -10.8941 +▁practise -10.8941 +▁universe -10.8941 +▁shilling -10.8941 +▁contest -10.8942 +▁ashore -10.8942 +▁commit -10.8983 +▁administration -10.8988 +▁studied -10.8988 +▁rigid -10.8988 +▁adorn -10.8989 +▁elsewhere -10.9035 +▁innocence -10.9035 +▁journal -10.9035 +▁landscape -10.9035 +▁telegraph -10.9035 +▁angrily -10.9035 +▁campaign -10.9035 +▁unjust -10.9035 +▁flourish -10.904 +▁challenge -10.9082 +▁torrent -10.9082 +▁relate -10.9127 +▁assembled -10.913 +▁impressed -10.913 +▁canoe -10.915 +▁conclud -10.9171 +▁quixote -10.9177 +▁satisfactory -10.9177 +▁niece -10.9177 +▁deaf -10.9178 +▁glid -10.9179 +▁jimmy -10.9179 +▁regulat -10.9179 +▁chatter -10.9215 +▁statue -10.9225 +▁glacier -10.9225 +▁envy -10.9225 +▁boston -10.9227 +▁richmond -10.9229 +▁denied -10.9229 +▁fanny -10.9232 +▁solomon -10.9273 +▁vulgar -10.9273 +▁stalk -10.9274 +▁spoon -10.9279 +▁abuse -10.928 +▁basin -10.9291 +▁feature -10.9293 +▁convict -10.9304 +▁admiral -10.9321 +▁architect -10.9321 +▁ribbon -10.9321 +▁permanent -10.9321 +▁april -10.9321 +▁jolly -10.9322 +borough -10.9322 +▁neighborhood -10.9323 +▁impart -10.9324 +▁horrid -10.937 +▁immortal -10.937 +▁penetrate -10.937 +▁prudence -10.937 +▁reconcil -10.937 +▁spaniard -10.937 +▁supposing -10.937 +▁telephone -10.937 +▁temperature -10.937 +▁oyster -10.937 +▁appointment -10.9375 +▁egyptian -10.9384 +▁dwelt -10.9419 +▁nephew -10.9419 +▁railroad -10.9419 +▁september -10.9419 +▁gilbert -10.9419 +▁wheat -10.9419 +▁device -10.9419 +▁squee -10.9453 +▁elegant -10.9468 +▁advertise -10.9517 +▁turtle -10.9517 +▁rational -10.9517 +▁brood -10.9519 +comb -10.9563 +▁assembly -10.9566 +▁cultivate -10.9566 +▁specimen -10.9566 +▁undoubtedly -10.9566 +▁editor -10.9567 +▁dropping -10.9567 +▁medical -10.9569 +▁balloon -10.9569 +▁whale -10.9574 +▁composition -10.9616 +▁footsteps -10.9616 +▁launcelot -10.9616 +▁discourse -10.9616 +▁errand -10.9616 +▁converse -10.9618 +▁advancing -10.9666 +▁downstairs -10.9666 +▁tumult -10.9666 +▁corrupt -10.9666 +▁suffice -10.9666 +▁anguish -10.9666 +▁shaggy -10.9666 +▁retire -10.9716 +▁timber -10.9717 +▁abstract -10.9767 +▁embroider -10.9767 +▁photograph -10.9767 +▁prosperity -10.9767 +▁terribly -10.9767 +▁territory -10.9767 +▁threshold -10.9767 +▁pavement -10.9767 +▁injured -10.9767 +▁levin -10.9767 +▁agitation -10.9818 +▁rascal -10.9818 +▁presume -10.9819 +▁strat -10.9842 +▁observing -10.9869 +▁obstacle -10.9869 +▁simplicity -10.9869 +▁slumber -10.9869 +▁supplied -10.9869 +▁combination -10.9869 +▁drain -10.9869 +▁wilderness -10.9869 +▁believing -10.992 +▁villain -10.992 +▁friday -10.992 +▁reckless -10.992 +▁injury -10.992 +▁clapp -10.9921 +▁symptom -10.9972 +▁kennedy -10.9972 +▁sledge -10.9972 +▁monday -10.9972 +▁hercules -10.9972 +▁ceiling -10.9972 +▁lemon -10.9972 +▁plague -10.9974 +▁canvas -10.9976 +▁impatience -11.0023 +▁uncomfortable -11.0023 +▁access -11.0023 +▁senator -11.0023 +▁swimming -11.0024 +▁barrier -11.0024 +▁adjust -11.0076 +▁comparison -11.0076 +▁proclaim -11.0076 +▁wrinkl -11.0076 +▁overlook -11.0076 +▁mitya -11.0076 +▁guilt -11.01 +▁distract -11.0128 +▁perception -11.0128 +▁precaution -11.0128 +▁spectator -11.0128 +▁surprising -11.0128 +▁disdain -11.0128 +▁bonnet -11.0128 +▁bapti -11.0129 +▁profess -11.0154 +▁inspector -11.018 +▁sketch -11.018 +▁structure -11.018 +▁ultimate -11.018 +▁confound -11.0181 +▁globe -11.0181 +▁insect -11.0181 +▁orchard -11.0181 +▁descent -11.0182 +▁amiable -11.0183 +▁independence -11.0233 +▁manufacture -11.0233 +▁sprinkle -11.0233 +▁nightingale -11.0233 +▁cushion -11.0233 +▁eminent -11.0233 +▁array -11.0234 +▁scott -11.0234 +▁troop -11.0234 +▁cosette -11.0234 +▁waving -11.0234 +▁irregular -11.0287 +▁persecut -11.0287 +▁derived -11.0287 +▁withdrew -11.0287 +▁caution -11.0287 +▁extract -11.0288 +▁suspicious -11.034 +▁memories -11.034 +▁nowhere -11.0341 +▁tremble -11.0343 +▁subtle -11.0343 +▁thorough -11.0349 +q -11.0372 +▁appropriate -11.0394 +▁slaughter -11.0394 +▁yourselves -11.0394 +▁thumb -11.0394 +▁twas -11.0394 +▁stray -11.0395 +▁abode -11.0395 +▁conspicuous -11.0448 +▁rebecca -11.0448 +▁sergeant -11.0448 +▁woke -11.0448 +▁apron -11.0451 +▁anticipate -11.0502 +▁discipline -11.0502 +▁glancing -11.0502 +▁pilgrim -11.0502 +▁sullen -11.0502 +▁contribute -11.0557 +▁prairie -11.0557 +▁carved -11.0559 +▁hypnoti -11.0612 +▁commerce -11.0612 +▁exclamation -11.0612 +▁muscular -11.0612 +▁november -11.0612 +▁phenomena -11.0612 +▁symbol -11.0612 +▁umbrella -11.0612 +▁diminish -11.0612 +▁parlour -11.0612 +▁threatening -11.0612 +▁stump -11.0612 +▁extensive -11.0667 +▁remembrance -11.0667 +▁combined -11.0667 +▁sheriff -11.0668 +▁laura -11.0673 +▁intercourse -11.0723 +▁supplies -11.0723 +▁landlord -11.0723 +▁stricken -11.0723 +▁shrink -11.0723 +▁caesar -11.0723 +▁drug -11.0726 +▁bewildered -11.0778 +▁commercial -11.0778 +▁nautilus -11.0778 +▁brutal -11.0779 +▁maggie -11.0779 +▁sphere -11.0779 +▁virgin -11.0816 +▁brethren -11.0835 +▁terrified -11.0835 +▁destiny -11.0835 +▁policy -11.0835 +▁housekeeper -11.0835 +▁ardent -11.0835 +▁discern -11.0836 +▁marquis -11.0836 +mouth -11.0854 +▁russia -11.0864 +▁wrap -11.0871 +▁britain -11.0891 +▁harbour -11.0891 +▁concert -11.0891 +▁harmony -11.0891 +▁donkey -11.0892 +▁damage -11.0892 +▁slim -11.0896 +about -11.0911 +▁luxury -11.0948 +▁paradise -11.0948 +▁culture -11.0948 +▁monstrous -11.0948 +▁tendency -11.0948 +▁julius -11.0948 +▁remedy -11.0948 +▁raoul -11.0948 +▁scold -11.0948 +▁decay -11.0948 +▁split -11.0949 +▁assault -11.1005 +▁december -11.1005 +▁moscow -11.1005 +▁explore -11.1005 +▁trousers -11.1005 +▁wrist -11.1006 +piece -11.1026 +▁tyrant -11.1063 +▁valentine -11.1063 +▁musket -11.1063 +▁abraham -11.1063 +▁strait -11.1063 +▁artificial -11.112 +▁faculty -11.112 +▁obligation -11.112 +▁resemblance -11.112 +▁inquiries -11.1121 +▁detain -11.1121 +▁swarm -11.1121 +▁pledge -11.1121 +▁admirable -11.1179 +▁defect -11.1179 +▁superintend -11.1179 +▁patriot -11.1179 +▁breton -11.1179 +▁dismal -11.1181 +▁recit -11.1191 +▁ignor -11.1232 +▁amelia -11.1237 +▁elephant -11.1296 +▁estimate -11.1296 +▁knelt -11.1296 +▁serving -11.1296 +▁shrill -11.1296 +▁text -11.1296 +▁studio -11.13 +▁alexander -11.1355 +▁wrought -11.1355 +▁abundant -11.1355 +▁situated -11.1355 +▁regain -11.1355 +▁sneer -11.1356 +▁sweat -11.1357 +▁wren -11.1359 +▁justify -11.138 +▁nigh -11.1409 +▁escort -11.1415 +▁inevitable -11.1415 +▁psmith -11.1415 +▁reluctant -11.1415 +▁preceding -11.1415 +▁resort -11.1415 +▁outrage -11.1419 +▁ambassador -11.1474 +▁consolation -11.1474 +▁remorse -11.1474 +▁behalf -11.1474 +▁formidable -11.1474 +▁gravity -11.1475 +▁apologi -11.1482 +▁divide -11.1484 +▁gigantic -11.1535 +▁october -11.1535 +▁flank -11.1535 +▁stooped -11.1535 +▁slew -11.1535 +▁confront -11.1535 +▁clara -11.1535 +▁film -11.1536 +▁bulk -11.1536 +dolph -11.1545 +▁eleanor -11.1595 +▁exclusive -11.1595 +▁japanese -11.1595 +▁sympathi -11.1595 +▁cavalry -11.1595 +▁perfume -11.1595 +▁federal -11.1595 +▁liquid -11.1595 +▁rubbing -11.1596 +▁oven -11.1597 +▁convuls -11.1656 +▁significant -11.1656 +▁deprived -11.1656 +▁responsibility -11.1656 +▁waistcoat -11.1656 +▁cluster -11.1656 +▁martha -11.1657 +▁attorney -11.1718 +▁droop -11.1718 +▁skilful -11.1718 +▁habitual -11.1718 +▁interven -11.1719 +▁owl -11.172 +▁conjecture -11.1779 +▁fantastic -11.1779 +▁responsible -11.1779 +▁destined -11.1779 +▁thereupon -11.1779 +▁goddess -11.178 +▁pacific -11.178 +▁warrant -11.178 +▁costume -11.178 +▁document -11.178 +▁bridle -11.1783 +▁california -11.1841 +▁democratic -11.1841 +▁eustace -11.1841 +▁squirrel -11.1841 +▁uncommon -11.1841 +▁plough -11.1841 +▁marvellous -11.1841 +▁tragedy -11.1841 +▁vault -11.1842 +▁hesitate -11.1853 +▁admiring -11.1904 +▁corporal -11.1904 +▁entitled -11.1904 +▁refrain -11.1904 +▁shrewd -11.1904 +▁strap -11.1927 +▁accurate -11.1967 +▁tempest -11.1967 +▁monument -11.1967 +▁siege -11.1967 +▁chinese -11.1967 +▁raven -11.1968 +▁loung -11.1969 +leigh -11.1985 +▁assassin -11.203 +▁inflict -11.203 +▁agitated -11.203 +▁desirable -11.203 +▁earliest -11.203 +▁launch -11.203 +▁pilot -11.2031 +▁pulse -11.2031 +▁liquor -11.2094 +▁scarecrow -11.2094 +▁skull -11.2094 +▁desolate -11.2094 +▁ticket -11.2094 +▁sublime -11.2094 +▁recess -11.2094 +▁serene -11.2094 +▁righteous -11.2094 +▁pinocchio -11.2158 +▁priscilla -11.2158 +▁charlotte -11.2158 +▁circular -11.2158 +▁injustice -11.2158 +▁thyself -11.2158 +▁occurrence -11.2158 +▁casual -11.2158 +▁trout -11.2158 +▁legend -11.2158 +▁fertil -11.2178 +▁background -11.2222 +▁comparatively -11.2222 +▁delicacy -11.2222 +▁estralla -11.2222 +▁manuscript -11.2222 +▁response -11.2222 +▁university -11.2222 +▁wolves -11.2222 +▁scandal -11.2222 +▁hoarse -11.2223 +▁stumble -11.2223 +▁convent -11.2272 +▁utili -11.2278 +▁examining -11.2287 +▁incapable -11.2287 +▁perceiving -11.2287 +▁philadelphia -11.2287 +▁subsequent -11.2287 +▁thieves -11.2287 +▁accumulat -11.2287 +▁damsel -11.2287 +▁scotch -11.2287 +▁underneath -11.2287 +▁smash -11.2287 +▁nobility -11.2287 +▁revolt -11.2288 +▁engage -11.229 +▁cathedral -11.2353 +▁despatch -11.2353 +▁eternity -11.2353 +▁january -11.2353 +▁probability -11.2353 +▁parallel -11.2353 +▁jimmie -11.2353 +▁champion -11.2353 +▁fisherman -11.2353 +▁jerry -11.2353 +▁swore -11.2353 +▁draught -11.2419 +▁opponent -11.2419 +▁primitive -11.2419 +▁significance -11.2419 +▁substantial -11.2419 +▁dunbar -11.2419 +▁commend -11.2419 +▁jasper -11.2419 +▁contemplate -11.2485 +▁testimony -11.2485 +▁imperial -11.2485 +▁adapt -11.2485 +▁juice -11.2485 +▁calamit -11.2489 +▁phoenix -11.2551 +▁prudent -11.2551 +▁solution -11.2551 +▁villefort -11.2551 +▁chateau -11.2551 +▁reaction -11.2551 +▁relax -11.2552 +▁quaint -11.2552 +▁plunder -11.2619 +▁distrust -11.2619 +▁prohibit -11.2619 +▁welfare -11.2619 +▁parlor -11.2619 +▁navigat -11.262 +▁tank -11.2624 +think -11.2657 +▁discourage -11.2686 +▁obstinate -11.2686 +▁rejoicing -11.2686 +▁vehicle -11.2686 +▁fancies -11.2686 +▁enlighten -11.2686 +▁sermon -11.2686 +▁illusion -11.2686 +▁anthea -11.2686 +▁martian -11.2688 +▁excite -11.2698 +▁attachment -11.2754 +▁generosity -11.2754 +▁unworthy -11.2754 +▁kettle -11.2754 +▁internal -11.2755 +▁incense -11.2756 +▁vibrat -11.2757 +▁adhere -11.2767 +▁february -11.2823 +▁incessant -11.2823 +▁mexican -11.2823 +▁interposed -11.2823 +▁granite -11.2823 +▁parcel -11.2823 +▁vexed -11.2823 +▁promote -11.2826 +▁debate -11.2839 +midst -11.2854 +▁cyril -11.2892 +▁embark -11.2892 +▁terrace -11.2892 +▁abundance -11.2892 +▁surgeon -11.2892 +▁aristocrat -11.2892 +▁literally -11.2892 +▁atlantic -11.2892 +▁martyr -11.2892 +▁senate -11.2892 +▁speck -11.2892 +▁loaf -11.2892 +vocation -11.2902 +▁administer -11.2961 +▁apprehend -11.2961 +▁elaborate -11.2961 +▁subdued -11.2961 +▁temporary -11.2961 +▁dominion -11.2961 +▁dignified -11.2961 +▁splash -11.2961 +▁conseil -11.2961 +▁dexter -11.2961 +▁unseen -11.2961 +▁tragic -11.2962 +ologist -11.3023 +▁sympathetic -11.3031 +▁bachelor -11.3031 +▁defense -11.3031 +▁excursion -11.3031 +▁faculties -11.3031 +▁proprietor -11.3031 +▁radiant -11.3031 +▁unnecessary -11.3031 +▁vacant -11.3031 +▁screw -11.3031 +▁ounce -11.3031 +▁gratify -11.3032 +▁calculated -11.3101 +▁keith -11.3101 +▁phenomenon -11.3101 +▁prominent -11.3101 +▁worried -11.3101 +▁climate -11.3101 +▁studies -11.3101 +▁aramis -11.3101 +▁bliss -11.3102 +▁contend -11.3102 +close -11.312 +▁continual -11.3127 +▁surpass -11.3172 +▁hebrew -11.3172 +▁identity -11.3172 +▁provoke -11.3172 +▁temperament -11.3172 +▁chariot -11.3172 +▁ninth -11.3172 +▁harbor -11.3173 +▁desirous -11.3244 +▁jerusalem -11.3244 +▁undertaking -11.3244 +▁chorus -11.3244 +▁scout -11.3244 +▁mirth -11.3244 +▁hymn -11.3244 +▁particle -11.3246 +▁apparatus -11.3316 +▁intelligible -11.3316 +▁invariably -11.3316 +▁pierced -11.3316 +▁review -11.3316 +▁flicker -11.3316 +▁exciting -11.3316 +▁gospel -11.3316 +▁dixon -11.3316 +▁revelation -11.3316 +▁constance -11.3316 +▁overtake -11.3316 +▁guinea -11.3316 +▁drap -11.3322 +▁precise -11.3343 +▁aladdin -11.3388 +▁chicago -11.3388 +▁tulliver -11.3388 +▁hamilton -11.3388 +▁garrison -11.3388 +▁disciple -11.3388 +▁intensity -11.3388 +▁traitor -11.3388 +▁chancellor -11.3388 +▁proverb -11.3388 +▁dagger -11.3389 +▁foresee -11.3399 +▁chauvelin -11.3461 +▁glimmer -11.3461 +▁volunteer -11.3461 +▁jungle -11.3461 +▁streak -11.3461 +▁sunrise -11.3461 +▁dissolv -11.3461 +▁confide -11.3482 +▁awhile -11.3535 +▁felicity -11.3535 +▁legislature -11.3535 +▁leonora -11.3535 +▁pitiful -11.3535 +▁colony -11.3535 +▁shawl -11.3536 +▁harmoni -11.3552 +▁arriving -11.3609 +▁carpenter -11.3609 +▁fundamental -11.3609 +▁overflow -11.3609 +▁expand -11.3609 +▁harvest -11.3609 +▁tidings -11.3609 +folk -11.3636 +▁feminine -11.3683 +▁innumerable -11.3683 +▁twentieth -11.3683 +▁trifling -11.3683 +▁ghastl -11.3683 +▁conquest -11.3683 +▁butterfly -11.3683 +▁daniel -11.3684 +▁scramble -11.3684 +▁facilit -11.3685 +▁forsake -11.3687 +▁behaviour -11.3759 +▁gorgeous -11.3759 +▁producing -11.3759 +▁happier -11.3759 +▁promising -11.3759 +▁rainbow -11.3759 +▁instinctively -11.3759 +▁decree -11.376 +▁copie -11.3764 +▁strew -11.3765 +▁eyebrows -11.3834 +▁irresistible -11.3834 +▁pharaoh -11.3834 +▁scrooge -11.3834 +▁unnatural -11.3834 +▁crumbs -11.3834 +▁refined -11.3834 +▁dreary -11.3834 +▁trench -11.3835 +▁clair -11.3838 +▁convince -11.386 +▁fringe -11.3877 +▁extremity -11.3911 +▁intimacy -11.3911 +▁scoundrel -11.3911 +▁suffrage -11.3911 +▁uneasiness -11.3911 +▁barricade -11.3911 +▁circulat -11.3911 +▁samuel -11.3911 +▁bruce -11.3911 +▁spake -11.3911 +▁ambitious -11.3988 +▁energetic -11.3988 +▁splendor -11.3988 +▁tuesday -11.3988 +▁virtuous -11.3988 diff --git a/modules/audio/asr/u2_conformer_librispeech/assets/data/mean_std.json b/modules/audio/asr/u2_conformer_librispeech/assets/data/mean_std.json new file mode 100644 index 00000000..c42cf7fb --- /dev/null +++ b/modules/audio/asr/u2_conformer_librispeech/assets/data/mean_std.json @@ -0,0 +1 @@ +{"mean_stat": [3419817384.9589553, 3554070049.1888413, 3818511309.9166613, 4066044518.3850017, 4291564631.2871633, 4447813845.146345, 4533096457.680424, 4535743891.989957, 4529762966.952207, 4506798370.255702, 4563810141.721841, 4621582319.277632, 4717208210.814803, 4782916961.295261, 4800534153.252695, 4816978042.979026, 4813370098.242317, 4783029495.131413, 4797780594.144404, 4697681126.278327, 4615891408.325888, 4660549391.6024275, 4576180438.146472, 4609080513.250168, 4575296489.058092, 4602504837.872262, 4568039825.650208, 4596829549.204861, 4590634987.343898, 4604371982.549804, 4623782318.317643, 4643582410.8842745, 4681460771.788484, 4759470876.31175, 4808639788.683043, 4828470941.416027, 4868984035.113543, 4906503986.801533, 4945995579.443381, 4936645225.986488, 4975902400.919519, 4960230208.656678, 4986734786.199859, 4983472199.8246765, 5002204376.162232, 5030432036.352981, 5060386169.086892, 5093482058.577236, 5118330657.308789, 5137270836.326198, 5140137363.319094, 5144296534.330122, 5158812605.654329, 5166263515.51458, 5156261604.282723, 5155820011.532965, 5154511256.8968, 5152063882.193671, 5153425524.412178, 5149000486.683038, 5154587156.35868, 5134412165.07972, 5092874838.792056, 5062281231.5140915, 5029059442.072953, 4996045017.917702, 4962203662.170533, 4928110046.282831, 4900476581.092096, 4881407033.533021, 4859626116.955097, 4851430742.3865795, 4850317443.454599, 4848197040.155383, 4837178106.464577, 4818448202.7298765, 4803345264.527405, 4765785994.104498, 4735296707.352132, 4699957946.40757], "var_stat": [39487786239.20539, 42865198005.60155, 49718916704.468704, 55953639455.490585, 62156293826.00315, 66738657819.12445, 69416921986.47835, 69657873431.17258, 69240303799.53061, 68286972351.43054, 69718367152.18843, 71405427710.7103, 74174200331.87572, 76047347951.43869, 76478048614.40665, 76810929560.19212, 76540466184.85634, 75538479521.34026, 75775624554.07217, 72775991318.16557, 70350402972.93352, 71358602366.48341, 68872845697.9878, 69552396791.49916, 68471390455.59991, 69022047288.07498, 67982260910.11236, 68656154716.71916, 68461419064.9241, 68795285460.65717, 69270474608.52791, 69754495937.76433, 70596044579.14969, 72207936275.97945, 73629619360.65047, 74746445259.57487, 75925168496.81197, 76973508692.04265, 78074337163.3413, 77765963787.96971, 78839167623.49733, 78328768943.2287, 79016127287.03778, 78922638306.99306, 79489768324.9408, 80354861037.44005, 81311991408.12526, 82368205917.26112, 83134782296.1741, 83667769421.23245, 83673751953.46239, 83806087685.62842, 84193971202.07523, 84424752763.34825, 84092846117.64104, 84039114093.08766, 83982515225.7085, 83909645482.75613, 83947278563.15077, 83800767707.19617, 83851106027.8772, 83089292432.37892, 82056425825.3622, 81138570746.92316, 80131843258.75557, 79130160837.19037, 78092166878.71533, 77104785522.79205, 76308548392.10454, 75709445890.58063, 75084778641.6033, 74795849006.19067, 74725807683.832, 74645651838.2169, 74300193368.39339, 73696619147.86806, 73212785808.97992, 72240491743.0697, 71420246227.32545, 70457076435.4593], "frame_num": 345484372} diff --git a/modules/audio/asr/u2_conformer_librispeech/assets/data/vocab.txt b/modules/audio/asr/u2_conformer_librispeech/assets/data/vocab.txt new file mode 100644 index 00000000..62d35f25 --- /dev/null +++ b/modules/audio/asr/u2_conformer_librispeech/assets/data/vocab.txt @@ -0,0 +1,5002 @@ + + +' +a +abeth +ability +able +ably +about +ac +ach +acious +ad +ade +ag +age +ah +ak +al +ally +am +an +ance +and +ang +ans +ant +ap +ar +ard +aries +artagnan +ary +as +at +ate +ated +ath +ating +ation +ations +ative +ator +atory +au +av +aw +ay +b +ba +bbe +bble +be +bel +ber +bi +ble +bo +board +borough +bra +bu +burg +burn +bury +by +c +ca +car +cast +ce +cent +ch +cha +che +ched +chi +cho +ci +ck +clock +close +co +comb +con +ctor +cu +cum +cy +d +da +dding +ddle +de +den +der +do +dolph +dy +e +ea +ed +ef +el +ella +em +ement +en +ence +encies +ened +ens +ent +er +ers +es +est +et +eth +ett +ette +ev +ever +ex +ey +f +fa +fall +fe +fer +ff +fi +field +fold +folk +foot +for +ford +form +ft +ful +g +ga +gan +gar +gate +ge +ged +gen +ger +gg +gi +ging +gn +go +gra +gu +gue +h +ha +ham +han +har +he +head +hen +her +hi +hin +ho +hold +hood +house +hu +hurst +hy +i +ia +ial +ian +ians +ib +ible +ic +ical +ick +id +ie +ied +ier +ies +if +ification +ified +ifying +ig +ight +ign +il +ile +ility +ily +im +in +ina +ine +iness +ing +io +ion +ions +ious +ip +ir +ire +is +ish +ism +ison +ist +istic +ists +it +itch +ite +ities +itude +ity +ium +ius +ive +j +ja +ji +jo +ju +k +ka +ke +keep +ker +ki +kin +king +ko +ky +l +la +lac +lan +land +lar +ld +le +led +leigh +ler +les +less +let +ley +lf +li +lie +light +like +lin +line +liness +ling +ll +lo +lock +lon +long +low +lt +lung +lus +ly +m +ma +man +mbled +me +men +ment +ments +mer +mi +midst +mmed +mo +mond +mont +more +most +mouth +mp +my +n +na +nce +nd +ne +ned +ner +ness +ney +ng +ni +nic +ning +nnie +nny +no +nt +ny +o +oc +od +og +ol +ological +ologist +ology +om +on +one +oo +ook +oon +op +or +ord +ors +ory +os +ot +ou +our +ous +ov +ow +p +pa +pe +pec +ped +per +pha +piece +ple +po +port +pose +pp +pping +ps +q +qua +que +qui +r +ra +ran +rate +re +red +ress +rg +ri +ric +rick +ridge +ries +right +rin +ring +ris +rk +rn +ro +ron +rous +row +rs +rt +ru +ry +s +sail +se +sh +ship +shire +side +some +son +st +stead +ster +stone +stra +t +ta +tan +te +ted +ten +ter +terior +th +the +ther +think +thorpe +ti +tic +ties +time +tin +ting +tion +to +ton +tri +tro +tte +ttered +ttle +tur +ty +u +ub +uc +uch +ud +ug +ugh +ul +ulation +um +un +und +uous +up +ur +ure +us +use +ut +ux +v +va +val +van +ve +ver +vi +ville +vo +vocation +w +wa +war +ward +way +we +well +wi +wick +win +wn +wood +work +worth +x +y +z +zz +▁ +▁a +▁ab +▁abandon +▁able +▁abode +▁about +▁above +▁abraham +▁abroad +▁absence +▁absent +▁absolute +▁absolutely +▁absorb +▁abstract +▁absurd +▁abundance +▁abundant +▁abuse +▁accent +▁accept +▁accepted +▁access +▁accident +▁accompanied +▁accompany +▁accomplish +▁accord +▁according +▁accordingly +▁account +▁accumulat +▁accurate +▁accuse +▁accustomed +▁achieve +▁acknowledg +▁acquaintance +▁acquainted +▁acquired +▁across +▁act +▁action +▁active +▁activity +▁actual +▁actually +▁adam +▁adapt +▁add +▁added +▁addition +▁address +▁addressed +▁adhere +▁adjust +▁administer +▁administration +▁admirable +▁admiral +▁admiration +▁admire +▁admiring +▁admit +▁admitted +▁adopt +▁adorn +▁advance +▁advanced +▁advancing +▁advantage +▁adventure +▁advertise +▁advice +▁advise +▁affair +▁affairs +▁affect +▁affected +▁affection +▁affectionate +▁affirm +▁afflict +▁afford +▁afraid +▁africa +▁after +▁afternoon +▁afterward +▁afterwards +▁again +▁against +▁age +▁agent +▁agitated +▁agitation +▁ago +▁agony +▁agree +▁agreeable +▁agreed +▁ah +▁ahead +▁aid +▁aim +▁air +▁al +▁aladdin +▁alarm +▁alas +▁albert +▁alexander +▁alice +▁alive +▁all +▁allow +▁allowed +▁almost +▁alone +▁along +▁aloud +▁already +▁also +▁altar +▁alter +▁although +▁altogether +▁always +▁alyosha +▁am +▁ama +▁ambassador +▁ambition +▁ambitious +▁amelia +▁america +▁american +▁amiable +▁amid +▁among +▁amount +▁amusement +▁an +▁anchor +▁ancient +▁and +▁andrew +▁angel +▁anger +▁angle +▁angrily +▁angry +▁anguish +▁animal +▁animals +▁anna +▁anne +▁announc +▁announced +▁another +▁answer +▁answered +▁anthea +▁anti +▁anticipate +▁anxiety +▁anxious +▁any +▁anybody +▁anyhow +▁anyone +▁anything +▁anywhere +▁apart +▁apartment +▁apologi +▁apparatus +▁apparent +▁apparently +▁appeal +▁appear +▁appearance +▁appeared +▁appetite +▁apple +▁application +▁applied +▁apply +▁appointed +▁appointment +▁appreciate +▁apprehend +▁apprehension +▁approach +▁approached +▁approaching +▁appropriate +▁approve +▁april +▁apron +▁apt +▁ar +▁arab +▁aramis +▁arch +▁architect +▁ardent +▁are +▁argue +▁argument +▁arise +▁aristocrat +▁arm +▁arms +▁army +▁arose +▁around +▁arranged +▁arrangement +▁array +▁arrest +▁arrival +▁arrive +▁arrived +▁arriving +▁arrow +▁art +▁arthur +▁article +▁artificial +▁artist +▁as +▁ascend +▁ascertain +▁ashamed +▁ashes +▁ashore +▁aside +▁ask +▁asked +▁asking +▁asleep +▁aspect +▁assassin +▁assault +▁assembled +▁assembly +▁assert +▁assist +▁assistance +▁assistant +▁associate +▁association +▁assume +▁assumed +▁assurance +▁assure +▁assured +▁astonished +▁astonishment +▁at +▁atlantic +▁atmosphere +▁attached +▁attachment +▁attack +▁attain +▁attempt +▁attend +▁attendant +▁attention +▁attentive +▁attitude +▁attorney +▁attract +▁attribute +▁audience +▁august +▁aunt +▁author +▁authorities +▁authority +▁autumn +▁avail +▁avenue +▁average +▁avoid +▁await +▁awake +▁awakened +▁aware +▁away +▁awful +▁awhile +▁awkward +▁awoke +▁axe +▁b +▁ba +▁baby +▁bachelor +▁back +▁background +▁backward +▁bad +▁bade +▁bag +▁bake +▁bal +▁balance +▁ball +▁balloon +▁ban +▁band +▁bank +▁bapti +▁bar +▁barbar +▁bare +▁bargain +▁bark +▁baron +▁barrel +▁barricade +▁barrier +▁base +▁basin +▁basket +▁bath +▁batter +▁battle +▁bay +▁be +▁bear +▁beard +▁bearing +▁beast +▁beat +▁beaten +▁beautiful +▁beauty +▁became +▁because +▁become +▁becoming +▁bed +▁bedroom +▁been +▁before +▁beg +▁began +▁beggar +▁begged +▁begin +▁beginning +▁begun +▁behalf +▁behave +▁behaviour +▁beheld +▁behind +▁behold +▁being +▁belief +▁believe +▁believed +▁believing +▁bell +▁belong +▁beloved +▁below +▁bench +▁bending +▁beneath +▁benefit +▁bent +▁bernard +▁beside +▁besides +▁best +▁bestow +▁betray +▁better +▁between +▁bewildered +▁beyond +▁bi +▁bible +▁bid +▁big +▁bill +▁billy +▁bind +▁bird +▁birds +▁birth +▁bishop +▁bit +▁bitter +▁bla +▁black +▁blade +▁blame +▁blank +▁blanket +▁bless +▁blew +▁blind +▁bliss +▁block +▁blood +▁bloom +▁blossom +▁blow +▁blu +▁blue +▁blush +▁bo +▁board +▁boast +▁boat +▁bob +▁bodies +▁body +▁boil +▁bold +▁bolt +▁bon +▁bond +▁bonnet +▁book +▁books +▁boot +▁boots +▁border +▁bore +▁born +▁borne +▁borrow +▁bosom +▁boston +▁both +▁bottle +▁bottom +▁bought +▁bound +▁bow +▁bowed +▁bowl +▁box +▁boy +▁boys +▁bra +▁brain +▁branch +▁branches +▁brand +▁brave +▁bread +▁break +▁breakfast +▁breaking +▁breast +▁breath +▁bree +▁brethren +▁breton +▁bri +▁brick +▁bride +▁bridge +▁bridle +▁brief +▁brig +▁bright +▁brilliant +▁bring +▁bringing +▁brisk +▁britain +▁british +▁bro +▁broad +▁broke +▁broken +▁brood +▁brook +▁brother +▁brothers +▁brought +▁brow +▁brown +▁bruce +▁brush +▁brutal +▁brute +▁bu +▁buck +▁build +▁building +▁built +▁bulk +▁bull +▁bullet +▁bunch +▁bundle +▁bur +▁burden +▁buried +▁burn +▁burning +▁burst +▁bush +▁bushes +▁business +▁busy +▁but +▁butter +▁butterfly +▁buy +▁by +▁c +▁ca +▁cab +▁cabin +▁caesar +▁cake +▁cal +▁calamit +▁calculated +▁california +▁call +▁called +▁calling +▁calm +▁came +▁camp +▁campaign +▁can +▁candid +▁candle +▁cannon +▁cannot +▁canoe +▁canvas +▁cap +▁capable +▁capacity +▁capital +▁captain +▁capture +▁car +▁card +▁cardinal +▁care +▁careful +▁carefully +▁careless +▁carlyle +▁carpenter +▁carpet +▁carr +▁carriage +▁carried +▁carry +▁carrying +▁cart +▁carved +▁case +▁cast +▁castle +▁casual +▁cat +▁catch +▁cathedral +▁catherine +▁catholic +▁cattle +▁caught +▁cause +▁caused +▁caution +▁cavalry +▁cave +▁ce +▁cease +▁ceased +▁ceiling +▁celebrat +▁cell +▁cellar +▁cent +▁center +▁central +▁centre +▁centuries +▁century +▁ceremony +▁certain +▁certainly +▁cetera +▁ch +▁cha +▁chain +▁chair +▁challenge +▁chamber +▁champion +▁chance +▁chancellor +▁change +▁changed +▁changing +▁channel +▁chap +▁chapter +▁char +▁character +▁characteristic +▁charge +▁chariot +▁charles +▁charlotte +▁charm +▁charming +▁chase +▁chateau +▁chatter +▁chauvelin +▁che +▁cheap +▁check +▁cheek +▁cheeks +▁cheer +▁cheerful +▁cheese +▁cherish +▁chest +▁chi +▁chicago +▁chicken +▁chief +▁child +▁childhood +▁children +▁chill +▁chimney +▁chin +▁china +▁chinese +▁choice +▁choose +▁chop +▁chorus +▁chose +▁chosen +▁chris +▁christ +▁christian +▁christmas +▁chu +▁chuck +▁church +▁cigar +▁circle +▁circular +▁circulat +▁circumstance +▁circumstances +▁citi +▁cities +▁city +▁civil +▁civili +▁cl +▁claim +▁clair +▁clapp +▁clara +▁clasp +▁class +▁classes +▁claw +▁clay +▁clean +▁clear +▁clearly +▁clergy +▁clerk +▁clever +▁cliff +▁climate +▁climb +▁clo +▁cloak +▁clock +▁close +▁closed +▁closely +▁cloth +▁clothes +▁cloud +▁clouds +▁club +▁cluster +▁clutch +▁co +▁coach +▁coal +▁coarse +▁coast +▁coat +▁cock +▁coffee +▁coffin +▁coin +▁col +▁cold +▁collar +▁collect +▁college +▁colonel +▁coloni +▁colony +▁color +▁colour +▁column +▁com +▁comb +▁combat +▁combination +▁combined +▁come +▁comes +▁comfort +▁comfortable +▁coming +▁command +▁commenced +▁commend +▁comment +▁commerce +▁commercial +▁commission +▁commit +▁committed +▁committee +▁common +▁commun +▁communicat +▁communication +▁community +▁comp +▁companion +▁companions +▁company +▁comparatively +▁compare +▁comparison +▁compass +▁compelled +▁complain +▁complete +▁completely +▁complex +▁compliment +▁composed +▁composition +▁comprehend +▁comrade +▁con +▁conceal +▁conceive +▁concentrat +▁conception +▁concern +▁concerned +▁concerning +▁concert +▁conclud +▁concluded +▁conclusion +▁condemn +▁condition +▁conditions +▁conduct +▁conf +▁confess +▁confide +▁confidence +▁confident +▁confined +▁confirm +▁conflict +▁confound +▁confront +▁confused +▁confusion +▁congress +▁conjecture +▁connected +▁connection +▁conquer +▁conquest +▁conscience +▁conscious +▁consciousness +▁conseil +▁consent +▁consequence +▁consequently +▁consider +▁considerable +▁consideration +▁considered +▁consist +▁consolation +▁conspicuous +▁constance +▁constant +▁constantly +▁constitute +▁constitution +▁construct +▁consult +▁consum +▁contact +▁contain +▁contemplate +▁contempt +▁contend +▁content +▁contest +▁continent +▁continual +▁continually +▁continue +▁continued +▁contract +▁contradict +▁contrary +▁contrast +▁contribute +▁control +▁convenient +▁convent +▁convention +▁conversation +▁converse +▁convert +▁convey +▁convict +▁conviction +▁convince +▁convinced +▁convuls +▁cook +▁cool +▁copie +▁copper +▁copy +▁cor +▁cordial +▁corn +▁corner +▁corporal +▁corpse +▁correct +▁correspond +▁corridor +▁corrupt +▁cosette +▁cost +▁costume +▁cottage +▁cotton +▁couch +▁could +▁couldn +▁council +▁counsel +▁count +▁countenance +▁counter +▁countess +▁countries +▁country +▁couple +▁courage +▁course +▁court +▁cousin +▁cover +▁covered +▁cow +▁coward +▁cra +▁crack +▁craft +▁crawl +▁cre +▁cream +▁created +▁creature +▁creatures +▁credit +▁creek +▁creep +▁crep +▁crew +▁cried +▁cries +▁crime +▁criminal +▁crimson +▁cristo +▁critic +▁cro +▁cross +▁crossed +▁crow +▁crowd +▁crown +▁cru +▁cruel +▁crumbs +▁crush +▁cry +▁crying +▁crystal +▁cu +▁cultivate +▁culture +▁cunning +▁cup +▁cur +▁curiosity +▁curious +▁curl +▁current +▁curse +▁curtain +▁cushion +▁custom +▁cut +▁cutting +▁cyril +▁d +▁da +▁dagger +▁daily +▁damage +▁damn +▁damp +▁damsel +▁dan +▁dance +▁dancing +▁danger +▁dangerous +▁danglars +▁daniel +▁dar +▁dare +▁dared +▁dark +▁darkness +▁darling +▁dash +▁date +▁daughter +▁david +▁dawn +▁day +▁days +▁de +▁dead +▁deaf +▁deal +▁dear +▁dearest +▁death +▁debate +▁debt +▁decay +▁deceive +▁december +▁decide +▁decided +▁decision +▁deck +▁declare +▁declared +▁decline +▁decorat +▁decree +▁deep +▁deeply +▁defeat +▁defect +▁defence +▁defend +▁defense +▁defi +▁definite +▁degree +▁delay +▁deliberate +▁delicacy +▁delicate +▁delicious +▁delight +▁delighted +▁delightful +▁deliver +▁demand +▁demanded +▁democratic +▁demon +▁den +▁denied +▁deny +▁depart +▁department +▁departure +▁depend +▁deposit +▁depress +▁deprived +▁depth +▁derived +▁descend +▁descended +▁descent +▁describe +▁described +▁description +▁desert +▁deserve +▁design +▁desirable +▁desire +▁desired +▁desirous +▁desk +▁desolate +▁despair +▁despatch +▁desperate +▁despise +▁despite +▁destined +▁destiny +▁destroy +▁destroyed +▁destruction +▁detail +▁detain +▁detect +▁detective +▁determin +▁determination +▁determined +▁develop +▁development +▁device +▁devil +▁devoted +▁devotion +▁devour +▁dexter +▁di +▁diamond +▁diana +▁dick +▁did +▁didn +▁die +▁died +▁differ +▁difference +▁different +▁difficult +▁difficulties +▁difficulty +▁dig +▁dignified +▁dignity +▁dim +▁diminish +▁din +▁dinner +▁direct +▁directed +▁direction +▁directly +▁dirty +▁dis +▁disagreeable +▁disappear +▁disappeared +▁disappoint +▁disappointment +▁disc +▁discern +▁discharge +▁disciple +▁discipline +▁discourage +▁discourse +▁discover +▁discovered +▁discovery +▁discuss +▁discussion +▁disdain +▁disease +▁disgrace +▁disguise +▁disgust +▁dish +▁dislike +▁dismal +▁dismay +▁dismiss +▁disorder +▁display +▁disposed +▁disposition +▁dispute +▁dissolv +▁distance +▁distant +▁distinct +▁distinction +▁distinguish +▁distinguished +▁distract +▁distress +▁distribut +▁district +▁distrust +▁disturb +▁div +▁divers +▁divide +▁divided +▁divine +▁division +▁dixon +▁do +▁doctor +▁doctrine +▁document +▁does +▁doesn +▁dog +▁dogs +▁doing +▁dollars +▁domestic +▁dominion +▁don +▁done +▁donkey +▁door +▁doors +▁doorway +▁dorothy +▁double +▁doubt +▁doubtful +▁doubtless +▁down +▁downstairs +▁drag +▁dragg +▁dragon +▁drain +▁drake +▁drama +▁drank +▁drap +▁draught +▁draw +▁drawing +▁drawn +▁dread +▁dreadful +▁dream +▁dreary +▁dress +▁dressed +▁drew +▁dri +▁drift +▁drink +▁drive +▁driven +▁driver +▁driving +▁droop +▁drop +▁dropped +▁dropping +▁drove +▁drown +▁drug +▁drum +▁drunk +▁dry +▁du +▁duchess +▁duck +▁due +▁duke +▁dull +▁dumb +▁dun +▁dunbar +▁dur +▁dusk +▁dust +▁dutch +▁duties +▁duty +▁dwarf +▁dwell +▁dwelt +▁dying +▁e +▁each +▁eager +▁eagerly +▁eagle +▁ear +▁earl +▁earlier +▁earliest +▁early +▁earn +▁earnest +▁ears +▁earth +▁ease +▁easier +▁easily +▁east +▁eastern +▁easy +▁eat +▁eaten +▁eating +▁echo +▁edge +▁edith +▁editor +▁educat +▁education +▁edward +▁effect +▁effort +▁eggs +▁egypt +▁egyptian +▁eight +▁eighteen +▁eighty +▁either +▁el +▁elaborate +▁elbow +▁elder +▁eldest +▁eleanor +▁elect +▁electric +▁elegant +▁element +▁elephant +▁eleven +▁eli +▁else +▁elsewhere +▁elsie +▁em +▁embark +▁embarrass +▁embrace +▁embroider +▁emerg +▁emily +▁eminent +▁emotion +▁emperor +▁emphasi +▁empire +▁employ +▁employed +▁empty +▁en +▁enable +▁enchant +▁enclos +▁encounter +▁encourage +▁end +▁endeavor +▁endeavour +▁endure +▁enemies +▁enemy +▁energetic +▁energy +▁engage +▁engaged +▁engagement +▁engine +▁england +▁english +▁enjoy +▁enjoyment +▁enlighten +▁enormous +▁enough +▁ensu +▁enter +▁entered +▁enterprise +▁entertain +▁enthusiasm +▁entire +▁entirely +▁entitled +▁entrance +▁entreat +▁envelope +▁envy +▁epi +▁equal +▁equally +▁er +▁ere +▁erect +▁errand +▁error +▁escape +▁escaped +▁escort +▁especially +▁essence +▁essential +▁establish +▁established +▁establishment +▁estate +▁esteem +▁estimate +▁estralla +▁eternal +▁eternity +▁europe +▁eustace +▁eva +▁even +▁evening +▁events +▁ever +▁every +▁everybody +▁everyone +▁everything +▁everywhere +▁evidence +▁evident +▁evidently +▁evil +▁ex +▁exact +▁exactly +▁examination +▁examine +▁examined +▁examining +▁example +▁exceed +▁exceedingly +▁excellency +▁excellent +▁except +▁exception +▁excess +▁exchange +▁excite +▁excited +▁excitement +▁exciting +▁exclaimed +▁exclamation +▁exclusive +▁excursion +▁excuse +▁execut +▁execution +▁exercise +▁exhaust +▁exhibit +▁exist +▁existence +▁expand +▁expect +▁expectation +▁expected +▁expedition +▁expense +▁experience +▁experiment +▁explain +▁explained +▁explanation +▁explore +▁exposed +▁express +▁expressed +▁expression +▁exquisite +▁extend +▁extended +▁extensive +▁extent +▁external +▁extra +▁extract +▁extraordinary +▁extreme +▁extremely +▁extremity +▁eye +▁eyebrows +▁eyes +▁f +▁fa +▁face +▁faces +▁facilit +▁facing +▁fact +▁faculties +▁faculty +▁faded +▁fail +▁failed +▁failure +▁faint +▁fair +▁fairly +▁fairy +▁faith +▁faithful +▁fall +▁fallen +▁falling +▁false +▁fame +▁familiar +▁families +▁family +▁famous +▁fan +▁fancied +▁fancies +▁fancy +▁fanny +▁fantastic +▁far +▁farewell +▁farm +▁farmer +▁farther +▁fashion +▁fast +▁fastened +▁fat +▁fatal +▁fate +▁father +▁fatigue +▁fault +▁favor +▁favorite +▁favour +▁favourite +▁fe +▁fear +▁fearful +▁feast +▁feather +▁feature +▁features +▁february +▁federal +▁feeble +▁feed +▁feel +▁feeling +▁feelings +▁feet +▁felicity +▁fell +▁fellow +▁felt +▁female +▁feminine +▁fence +▁fer +▁fertil +▁fetch +▁fever +▁few +▁fi +▁field +▁fields +▁fierce +▁fifteen +▁fifth +▁fifty +▁fight +▁fighting +▁figure +▁fill +▁filled +▁film +▁fin +▁final +▁finally +▁find +▁finding +▁fine +▁finger +▁fingers +▁finish +▁finished +▁fire +▁firm +▁firmly +▁first +▁fish +▁fisherman +▁fit +▁fitted +▁five +▁fix +▁fixed +▁fl +▁flag +▁flame +▁flank +▁flash +▁flat +▁flatter +▁fled +▁flee +▁fleet +▁flesh +▁flew +▁flicker +▁flight +▁flo +▁flock +▁flood +▁floor +▁florence +▁flour +▁flourish +▁flow +▁flower +▁flowers +▁flu +▁flutter +▁fly +▁flying +▁fo +▁fog +▁fold +▁folk +▁follow +▁followed +▁following +▁folly +▁fond +▁food +▁fool +▁foolish +▁foot +▁footsteps +▁for +▁forbid +▁force +▁forced +▁fore +▁forehead +▁foreign +▁foresee +▁forest +▁forget +▁forgive +▁forgot +▁forgotten +▁form +▁formed +▁former +▁formidable +▁forsake +▁forth +▁fortnight +▁fortunate +▁fortune +▁forty +▁forward +▁fought +▁found +▁fountain +▁four +▁fourteen +▁fourth +▁fowl +▁fox +▁fra +▁fragment +▁frame +▁france +▁francis +▁francs +▁frank +▁fred +▁frederick +▁free +▁freedom +▁french +▁frequent +▁frequently +▁fresh +▁fri +▁friday +▁friend +▁friendly +▁friends +▁friendship +▁fright +▁frightened +▁frightful +▁fringe +▁fro +▁frog +▁from +▁front +▁frown +▁fruit +▁fu +▁fulfil +▁full +▁fully +▁fun +▁function +▁fundamental +▁funeral +▁funny +▁fur +▁furious +▁furnish +▁furniture +▁further +▁future +▁g +▁ga +▁gain +▁gained +▁gall +▁gallant +▁gallery +▁gallop +▁game +▁gar +▁garden +▁garrison +▁gasp +▁gate +▁gather +▁gathered +▁gave +▁gay +▁ge +▁gen +▁general +▁generally +▁generation +▁generosity +▁generous +▁genius +▁gentle +▁gentleman +▁gentlemen +▁gently +▁genuine +▁george +▁ger +▁german +▁gesture +▁get +▁getting +▁ghastl +▁ghost +▁gi +▁giant +▁gift +▁gigantic +▁gil +▁gilbert +▁girl +▁girls +▁give +▁given +▁giving +▁gla +▁glacier +▁glad +▁glance +▁glancing +▁glass +▁gleam +▁glen +▁glid +▁glimmer +▁glimpse +▁glitter +▁globe +▁gloom +▁gloomy +▁glorious +▁glory +▁glove +▁glow +▁go +▁goat +▁god +▁goddess +▁goes +▁going +▁gold +▁golden +▁gone +▁good +▁gorgeous +▁gospel +▁gossip +▁got +▁govern +▁government +▁governor +▁gown +▁gra +▁grace +▁graceful +▁gracious +▁gradually +▁grand +▁grandfather +▁grandmother +▁granite +▁grant +▁grasp +▁grass +▁grateful +▁gratify +▁gratitude +▁grave +▁gravity +▁gray +▁gre +▁great +▁greater +▁greatest +▁greatly +▁greek +▁green +▁grew +▁grey +▁gri +▁grief +▁grieve +▁grim +▁grin +▁gro +▁groan +▁ground +▁group +▁grove +▁grow +▁growing +▁growl +▁grown +▁growth +▁gu +▁guard +▁guess +▁guest +▁guide +▁guilt +▁guilty +▁guinea +▁gun +▁ha +▁habit +▁habitual +▁had +▁hair +▁hale +▁half +▁hall +▁halt +▁ham +▁hamilton +▁hammer +▁hand +▁handkerchief +▁hands +▁handsome +▁hang +▁hanging +▁hans +▁happen +▁happened +▁happier +▁happily +▁happiness +▁happy +▁har +▁harbor +▁harbour +▁hard +▁hardly +▁harm +▁harmoni +▁harmony +▁harry +▁harsh +▁harvest +▁has +▁haste +▁hastened +▁hastily +▁hat +▁hate +▁hath +▁hatred +▁haunt +▁have +▁haven +▁having +▁hawk +▁hay +▁he +▁head +▁heads +▁health +▁heap +▁hear +▁heard +▁hearing +▁heart +▁heat +▁heaven +▁heavily +▁heavy +▁hebrew +▁hedge +▁height +▁held +▁helen +▁help +▁helpless +▁hence +▁henry +▁her +▁herbert +▁hercules +▁here +▁hero +▁herself +▁hesitate +▁hesitated +▁hesitation +▁hi +▁hid +▁hidden +▁hide +▁hideous +▁high +▁higher +▁highest +▁hill +▁hills +▁him +▁himself +▁hind +▁hint +▁his +▁history +▁hit +▁hither +▁hitherto +▁ho +▁hoarse +▁hold +▁holding +▁hole +▁holiday +▁holland +▁hollow +▁holy +▁home +▁honest +▁honey +▁honor +▁honour +▁hook +▁hope +▁hoped +▁hopeless +▁hoping +▁hori +▁horn +▁horrible +▁horrid +▁horror +▁horse +▁horses +▁hospital +▁host +▁hot +▁hotel +▁hour +▁hours +▁house +▁household +▁housekeeper +▁houses +▁how +▁however +▁hu +▁huge +▁hum +▁human +▁humanity +▁humble +▁humor +▁humour +▁hundred +▁hung +▁hunger +▁hungry +▁hunt +▁hunter +▁hunting +▁hurried +▁hurry +▁hurt +▁husband +▁hush +▁hut +▁hy +▁hymn +▁hypnoti +▁i +▁ice +▁idea +▁ideal +▁ideas +▁identity +▁idiot +▁idle +▁if +▁ignor +▁ignorance +▁ignorant +▁ill +▁illusion +▁illustrat +▁image +▁imagination +▁imagine +▁imitat +▁immediate +▁immediately +▁immense +▁immortal +▁imp +▁impart +▁impatience +▁impatient +▁imperfect +▁imperial +▁import +▁importance +▁important +▁impossible +▁impressed +▁impression +▁improve +▁improvement +▁impulse +▁in +▁incapable +▁incense +▁incessant +▁inches +▁incident +▁inclination +▁inclined +▁includ +▁income +▁increase +▁increased +▁increasing +▁indeed +▁independence +▁independent +▁india +▁indian +▁indians +▁indifference +▁indifferent +▁indignant +▁indignation +▁individual +▁induce +▁indulge +▁industry +▁inevitable +▁infant +▁inferior +▁infinite +▁inflict +▁influence +▁information +▁informed +▁inhabit +▁inhabitants +▁inherit +▁injured +▁injury +▁injustice +▁innocence +▁innocent +▁innumerable +▁inquire +▁inquired +▁inquiries +▁inquiry +▁insect +▁inside +▁insist +▁inspector +▁instance +▁instant +▁instantly +▁instead +▁instinct +▁instinctively +▁institution +▁instruct +▁instrument +▁insult +▁intellect +▁intellectual +▁intelligence +▁intelligent +▁intelligible +▁intend +▁intended +▁intense +▁intensity +▁intent +▁intention +▁inter +▁intercourse +▁interest +▁interested +▁interesting +▁interfere +▁internal +▁interposed +▁interpret +▁interrupt +▁interrupted +▁interval +▁interven +▁interview +▁intimacy +▁intimate +▁into +▁introduced +▁invariably +▁invent +▁investigat +▁invisible +▁invitation +▁invited +▁ireland +▁irish +▁iron +▁irre +▁irregular +▁irresistible +▁is +▁isabel +▁island +▁isn +▁issue +▁it +▁italian +▁italy +▁its +▁itself +▁j +▁ja +▁jack +▁jackson +▁jacob +▁james +▁jane +▁january +▁japanese +▁jar +▁jasper +▁jaw +▁je +▁jealous +▁jean +▁jerk +▁jerry +▁jerusalem +▁jest +▁jesus +▁jew +▁jewel +▁jim +▁jimmie +▁jimmy +▁jo +▁job +▁joe +▁john +▁johnson +▁join +▁joined +▁joke +▁jolly +▁jones +▁joseph +▁journal +▁journey +▁joy +▁ju +▁jud +▁judge +▁judgment +▁juice +▁julia +▁julie +▁julius +▁jump +▁jumped +▁june +▁jungle +▁just +▁justice +▁justify +▁k +▁ka +▁kate +▁katy +▁keen +▁keep +▁keeping +▁keith +▁ken +▁kennedy +▁kept +▁kettle +▁key +▁ki +▁kick +▁kill +▁killed +▁kind +▁kindly +▁kindness +▁king +▁kingdom +▁kiss +▁kissed +▁kit +▁kitchen +▁kitty +▁knee +▁knees +▁knelt +▁knew +▁knife +▁knight +▁knit +▁knock +▁knot +▁know +▁knowing +▁knowledge +▁known +▁knows +▁ko +▁la +▁labor +▁labour +▁lace +▁lack +▁lad +▁ladder +▁ladies +▁lady +▁laid +▁lake +▁lamb +▁lament +▁lamp +▁land +▁landlord +▁landscape +▁lane +▁language +▁lantern +▁lap +▁large +▁larger +▁last +▁late +▁later +▁latter +▁laugh +▁laughed +▁laughing +▁laughter +▁launcelot +▁launch +▁laura +▁law +▁laws +▁lawyer +▁lay +▁le +▁lead +▁leader +▁leading +▁leaf +▁league +▁lean +▁leaned +▁leaning +▁leap +▁learn +▁learned +▁least +▁leather +▁leave +▁leaves +▁leaving +▁lecture +▁led +▁left +▁leg +▁legend +▁legislature +▁legs +▁leisure +▁lemon +▁lend +▁length +▁leonora +▁less +▁lesson +▁lest +▁let +▁letter +▁letters +▁level +▁levin +▁li +▁liberal +▁liberty +▁library +▁lie +▁lies +▁lieutenant +▁life +▁lift +▁lifted +▁light +▁lightning +▁like +▁liked +▁likely +▁likewise +▁limb +▁limit +▁lin +▁lincoln +▁line +▁lines +▁linger +▁lion +▁lips +▁liquid +▁liquor +▁list +▁listen +▁listened +▁listening +▁literally +▁literary +▁literature +▁little +▁live +▁lived +▁lives +▁living +▁lo +▁load +▁loaf +▁local +▁lock +▁locked +▁lodge +▁lodging +▁lofty +▁log +▁london +▁lonely +▁long +▁longer +▁look +▁looked +▁looking +▁looks +▁loose +▁lord +▁lose +▁losing +▁loss +▁lost +▁lot +▁loud +▁louis +▁loung +▁love +▁loved +▁lovely +▁lover +▁loving +▁low +▁lower +▁loyal +▁lu +▁luc +▁luck +▁lucy +▁lunch +▁luxury +▁lying +▁lyn +▁m +▁ma +▁mac +▁machine +▁mad +▁madam +▁madame +▁made +▁mademoiselle +▁maggie +▁magic +▁magician +▁magistrate +▁magnificent +▁maid +▁maiden +▁main +▁maintain +▁majesty +▁major +▁majority +▁make +▁makes +▁making +▁mal +▁male +▁mamma +▁man +▁manage +▁managed +▁manifest +▁mankind +▁manner +▁manufacture +▁manuscript +▁many +▁mar +▁marble +▁march +▁margaret +▁marguerite +▁marian +▁marilla +▁mark +▁marked +▁market +▁marquis +▁marriage +▁married +▁marry +▁marsh +▁martha +▁martian +▁martin +▁martyr +▁marvel +▁marvellous +▁mary +▁mask +▁mass +▁master +▁mat +▁match +▁mate +▁material +▁matter +▁matters +▁matthew +▁maxim +▁may +▁maybe +▁me +▁meadow +▁meal +▁mean +▁meaning +▁means +▁meant +▁meantime +▁meanwhile +▁measure +▁meat +▁mechanical +▁medi +▁medical +▁medicine +▁meet +▁meeting +▁melancholy +▁member +▁members +▁memories +▁memory +▁men +▁mental +▁mention +▁mentioned +▁mer +▁merchant +▁mercy +▁mere +▁merely +▁merit +▁merry +▁message +▁messenger +▁met +▁metal +▁method +▁mexican +▁mi +▁michael +▁mid +▁middle +▁midnight +▁midst +▁might +▁mighty +▁mil +▁mild +▁mile +▁miles +▁military +▁milk +▁mill +▁million +▁min +▁mind +▁mine +▁mingled +▁minister +▁minute +▁minutes +▁miracle +▁mirror +▁mirth +▁mis +▁mischief +▁miserable +▁misery +▁misfortune +▁miss +▁mission +▁missus +▁mist +▁mistake +▁mistaken +▁mister +▁mistress +▁mitya +▁mix +▁mixture +▁mo +▁mock +▁mode +▁moderate +▁modern +▁modest +▁moment +▁mon +▁monarch +▁monday +▁money +▁monk +▁monkey +▁monsieur +▁monster +▁monstrous +▁monte +▁month +▁months +▁monument +▁mood +▁moon +▁moonlight +▁mor +▁moral +▁more +▁moreover +▁morning +▁morrow +▁mortal +▁moscow +▁most +▁mother +▁motion +▁motionless +▁motive +▁motor +▁mould +▁mount +▁mountain +▁mountains +▁mounted +▁mourn +▁mouse +▁mouth +▁move +▁moved +▁movement +▁moving +▁mu +▁much +▁mud +▁mule +▁multitude +▁murder +▁murderer +▁murmur +▁murmured +▁muscle +▁muscular +▁music +▁musket +▁must +▁muttered +▁mutual +▁my +▁myself +▁mysterious +▁mystery +▁na +▁nail +▁naked +▁name +▁named +▁nancy +▁napoleon +▁narrat +▁narrow +▁natasha +▁nation +▁national +▁native +▁natural +▁naturally +▁nature +▁naught +▁nautilus +▁nav +▁navigat +▁nay +▁ne +▁near +▁nearer +▁nearest +▁nearly +▁neat +▁necessarily +▁necessary +▁necessity +▁neck +▁need +▁needed +▁neglect +▁negro +▁neighbor +▁neighborhood +▁neighbour +▁neighbourhood +▁neither +▁nephew +▁nerve +▁nervous +▁nest +▁never +▁nevertheless +▁new +▁news +▁newspaper +▁next +▁ni +▁nice +▁nicholas +▁niece +▁nigh +▁night +▁nightingale +▁nine +▁nineteen +▁ninety +▁ninth +▁no +▁nobility +▁noble +▁nobody +▁nodded +▁noise +▁none +▁nonsense +▁nor +▁normal +▁norman +▁north +▁northern +▁nose +▁not +▁note +▁nothing +▁notice +▁noticed +▁notwithstanding +▁novel +▁november +▁now +▁nowhere +▁nu +▁number +▁numerous +▁nurse +▁nut +▁o +▁oak +▁oath +▁ob +▁obedience +▁obey +▁object +▁objection +▁obligation +▁obliged +▁obscure +▁observation +▁observe +▁observed +▁observing +▁obstacle +▁obstinate +▁obtain +▁obtained +▁obvious +▁occasion +▁occasionally +▁occupation +▁occupied +▁occupy +▁occur +▁occurred +▁occurrence +▁ocean +▁october +▁odd +▁of +▁off +▁offend +▁offer +▁offered +▁office +▁officer +▁officers +▁official +▁often +▁oh +▁oil +▁old +▁oliver +▁on +▁once +▁one +▁only +▁open +▁opened +▁opening +▁opera +▁operation +▁opinion +▁opponent +▁opportunity +▁opposite +▁opposition +▁oppress +▁or +▁orange +▁orchard +▁order +▁ordered +▁orders +▁ordinary +▁organ +▁organi +▁origin +▁original +▁ornament +▁other +▁others +▁otherwise +▁ought +▁ounce +▁our +▁ourselves +▁out +▁outrage +▁outside +▁oven +▁over +▁overcome +▁overflow +▁overlook +▁overtake +▁overwhelm +▁owe +▁owing +▁owl +▁own +▁oyster +▁p +▁pa +▁pace +▁pacific +▁pack +▁page +▁paid +▁pain +▁painful +▁painted +▁pair +▁pal +▁palace +▁pale +▁palm +▁pan +▁papa +▁paper +▁papers +▁par +▁para +▁paradise +▁parallel +▁parcel +▁pardon +▁parents +▁paris +▁park +▁parliament +▁parlor +▁parlour +▁part +▁particle +▁particular +▁particularly +▁parties +▁partner +▁parts +▁party +▁pass +▁passage +▁passed +▁passenger +▁passing +▁passion +▁passionate +▁past +▁pat +▁patch +▁path +▁patience +▁patient +▁patriot +▁paul +▁pause +▁paused +▁pavement +▁paw +▁pay +▁pe +▁pea +▁peace +▁peak +▁pearl +▁peasant +▁peculiar +▁peep +▁peer +▁pen +▁pencil +▁penetrate +▁penny +▁people +▁pepper +▁per +▁perceive +▁perceived +▁perceiving +▁perception +▁perch +▁perfect +▁perfection +▁perfectly +▁perform +▁performance +▁perfume +▁perhaps +▁peril +▁period +▁perish +▁permanent +▁permission +▁permit +▁permitted +▁perpetual +▁perplex +▁persecut +▁persist +▁person +▁personal +▁persons +▁persuade +▁pet +▁peter +▁pharaoh +▁phenomena +▁phenomenon +▁phil +▁philadelphia +▁philip +▁philosopher +▁philosophy +▁phoenix +▁photograph +▁phrase +▁physical +▁physician +▁pi +▁piano +▁pick +▁picked +▁picture +▁piece +▁pieces +▁pierced +▁pierre +▁pig +▁pile +▁pilgrim +▁pill +▁pillow +▁pilot +▁pin +▁pine +▁pink +▁pinocchio +▁pipe +▁pirate +▁pistol +▁pit +▁pitch +▁pitiful +▁pity +▁pla +▁plac +▁place +▁placed +▁places +▁plague +▁plain +▁plainly +▁plan +▁planet +▁plant +▁plate +▁platform +▁play +▁played +▁playing +▁plea +▁pleasant +▁please +▁pleased +▁pleasure +▁pledge +▁plenty +▁plot +▁plough +▁pluck +▁plum +▁plunder +▁plunge +▁po +▁pocket +▁poem +▁poet +▁poetry +▁point +▁pointed +▁poison +▁pole +▁police +▁policy +▁polish +▁polite +▁political +▁politics +▁polly +▁pond +▁pony +▁pool +▁poor +▁pope +▁popular +▁population +▁porch +▁port +▁porthos +▁portion +▁portrait +▁position +▁positive +▁possess +▁possessed +▁possession +▁possibility +▁possible +▁possibly +▁post +▁pot +▁pound +▁pounds +▁pour +▁poverty +▁powder +▁power +▁powerful +▁powers +▁pra +▁practical +▁practice +▁practise +▁prairie +▁praise +▁pray +▁prayer +▁pre +▁preach +▁precaution +▁precede +▁preceding +▁precious +▁precise +▁precisely +▁prefer +▁preferred +▁prejudice +▁preparation +▁prepare +▁prepared +▁preparing +▁presence +▁present +▁presented +▁presently +▁preserv +▁president +▁press +▁pressed +▁pressure +▁presume +▁pretend +▁pretty +▁prevail +▁prevent +▁previous +▁pri +▁price +▁pride +▁priest +▁primitive +▁prince +▁princess +▁principal +▁principle +▁print +▁priscilla +▁prison +▁prisoner +▁private +▁privilege +▁pro +▁probability +▁probable +▁probably +▁problem +▁proceed +▁proceeded +▁process +▁proclaim +▁procure +▁produce +▁produced +▁producing +▁product +▁profess +▁profession +▁professor +▁profit +▁profound +▁progress +▁prohibit +▁project +▁prominent +▁promise +▁promised +▁promising +▁promote +▁prompt +▁pronounc +▁proof +▁prop +▁proper +▁properly +▁property +▁prophet +▁proportion +▁proposal +▁propose +▁proposed +▁proposition +▁proprietor +▁prospect +▁prosperity +▁protect +▁protection +▁protest +▁proud +▁prove +▁proved +▁proverb +▁provide +▁provided +▁province +▁provision +▁provoke +▁prudence +▁prudent +▁psmith +▁pu +▁public +▁publish +▁puff +▁pull +▁pulled +▁pulse +▁punish +▁punishment +▁pupil +▁pur +▁purchase +▁pure +▁purple +▁purpose +▁purse +▁pursue +▁pursued +▁pursuit +▁push +▁pushed +▁put +▁putting +▁qua +▁quaint +▁qualities +▁quality +▁quantity +▁quarrel +▁quarter +▁queen +▁queer +▁question +▁questions +▁qui +▁quick +▁quickly +▁quiet +▁quietly +▁quite +▁quiver +▁quixote +▁quo +▁quoth +▁r +▁ra +▁rabbit +▁race +▁rachel +▁radiant +▁rag +▁rage +▁rail +▁railroad +▁railway +▁rain +▁rainbow +▁raise +▁raised +▁raising +▁ralph +▁ram +▁ran +▁rang +▁range +▁rank +▁raoul +▁rapid +▁rapidly +▁rare +▁rascal +▁rate +▁rather +▁rational +▁rattl +▁raven +▁ray +▁re +▁reach +▁reached +▁reaction +▁read +▁reader +▁readily +▁reading +▁ready +▁real +▁reali +▁reality +▁really +▁rear +▁reason +▁rebecca +▁rebel +▁recall +▁receive +▁received +▁receiving +▁recent +▁reception +▁recess +▁recit +▁reckless +▁reckon +▁recogni +▁recollect +▁recollection +▁recommend +▁reconcil +▁record +▁recover +▁recovered +▁red +▁reduced +▁refer +▁reference +▁refined +▁reflect +▁reflection +▁reform +▁refrain +▁refresh +▁refuge +▁refuse +▁refused +▁regain +▁regard +▁regarded +▁regiment +▁region +▁regret +▁regular +▁regulat +▁reign +▁reject +▁rejoice +▁rejoicing +▁relate +▁related +▁relation +▁relative +▁relax +▁release +▁reli +▁relief +▁relieve +▁religion +▁religious +▁reluctant +▁remain +▁remained +▁remark +▁remarkable +▁remarked +▁remedy +▁remember +▁remembered +▁remembrance +▁remind +▁remorse +▁remote +▁remove +▁removed +▁render +▁rendered +▁renew +▁rent +▁rep +▁repair +▁repeat +▁repeated +▁repent +▁replied +▁reply +▁report +▁represent +▁representative +▁reproach +▁republic +▁reputation +▁request +▁require +▁required +▁rescue +▁resemblance +▁resemble +▁reserve +▁residence +▁resign +▁resist +▁resistance +▁resolute +▁resolution +▁resolved +▁resort +▁resource +▁respect +▁response +▁responsibility +▁responsible +▁rest +▁restless +▁restore +▁restrain +▁result +▁resumed +▁retain +▁retire +▁retired +▁retorted +▁retreat +▁return +▁returned +▁returning +▁rev +▁reveal +▁revelation +▁revenge +▁rever +▁review +▁revolt +▁revolution +▁reward +▁ri +▁ribbon +▁rich +▁richard +▁richmond +▁rid +▁ride +▁ridiculous +▁riding +▁rifle +▁right +▁righteous +▁rigid +▁ring +▁ripe +▁rise +▁rising +▁risk +▁rival +▁river +▁ro +▁road +▁roar +▁roast +▁rob +▁robber +▁robe +▁robert +▁robin +▁rock +▁rocks +▁rode +▁roll +▁rolled +▁roman +▁rome +▁roof +▁room +▁root +▁rope +▁rosa +▁rose +▁rough +▁round +▁roused +▁route +▁row +▁royal +▁ru +▁rub +▁rubbed +▁rubbing +▁rude +▁ruin +▁rule +▁rum +▁run +▁running +▁rush +▁rushed +▁russia +▁russian +▁ruth +▁s +▁sa +▁sacred +▁sacrifice +▁sad +▁saddle +▁safe +▁safety +▁said +▁sail +▁sailor +▁saint +▁sake +▁sal +▁salt +▁salute +▁sam +▁same +▁samuel +▁san +▁sancho +▁sand +▁sang +▁sank +▁sarah +▁sat +▁satisfaction +▁satisfactory +▁satisfied +▁satisfy +▁saturday +▁sauce +▁savage +▁save +▁saved +▁saving +▁saw +▁say +▁saying +▁says +▁sc +▁sca +▁scale +▁scandal +▁scar +▁scarce +▁scarcely +▁scarecrow +▁scarlet +▁scattered +▁scene +▁scent +▁sch +▁scheme +▁scholar +▁school +▁science +▁scientific +▁scold +▁score +▁scorn +▁scotch +▁scotland +▁scott +▁scoundrel +▁scout +▁scramble +▁scrap +▁scratch +▁scream +▁screen +▁screw +▁scrooge +▁se +▁sea +▁seal +▁search +▁season +▁seat +▁seated +▁second +▁secret +▁secretary +▁section +▁secure +▁security +▁see +▁seeing +▁seek +▁seem +▁seemed +▁seems +▁seen +▁sei +▁seldom +▁select +▁self +▁selfish +▁sell +▁senate +▁senator +▁send +▁sensation +▁sense +▁sensible +▁sensitive +▁sent +▁sentence +▁sentiment +▁separate +▁separated +▁september +▁ser +▁serene +▁sergeant +▁series +▁serious +▁sermon +▁serpent +▁servant +▁servants +▁serve +▁served +▁service +▁serving +▁set +▁setting +▁settle +▁settled +▁seven +▁seventeen +▁seventy +▁several +▁severe +▁sex +▁sh +▁sha +▁shade +▁shadow +▁shaggy +▁shake +▁shakespeare +▁shaking +▁shall +▁shame +▁shape +▁share +▁sharp +▁sharply +▁shawl +▁she +▁sheep +▁shelter +▁shepherd +▁sheriff +▁shield +▁shift +▁shilling +▁shine +▁shining +▁ship +▁ships +▁shirt +▁shiver +▁shock +▁shoe +▁shoes +▁shone +▁shook +▁shoot +▁shop +▁shore +▁short +▁shot +▁should +▁shoulder +▁shoulders +▁shout +▁shouted +▁show +▁showed +▁shown +▁shrewd +▁shriek +▁shrill +▁shrink +▁shudder +▁shut +▁si +▁sick +▁side +▁sides +▁siege +▁sigh +▁sighed +▁sight +▁sign +▁signal +▁significance +▁significant +▁silence +▁silent +▁silk +▁silly +▁silver +▁similar +▁simon +▁simple +▁simplicity +▁simply +▁sin +▁since +▁sing +▁singing +▁single +▁singular +▁sink +▁sir +▁sister +▁sit +▁sitting +▁situated +▁situation +▁six +▁sixteen +▁sixty +▁sketch +▁ski +▁skilful +▁skill +▁skin +▁skirt +▁skull +▁sky +▁slain +▁slaughter +▁slave +▁slavery +▁slaves +▁sledge +▁sleep +▁sleeve +▁slender +▁slept +▁slew +▁slice +▁slid +▁slight +▁slightest +▁slightly +▁slim +▁slip +▁slipped +▁slo +▁slope +▁slow +▁slowly +▁slumber +▁small +▁smart +▁smash +▁smell +▁smile +▁smiled +▁smiling +▁smith +▁smoke +▁smoking +▁smooth +▁smot +▁snake +▁snap +▁snatch +▁sneer +▁snow +▁so +▁social +▁society +▁soft +▁softly +▁soil +▁sold +▁soldier +▁soldiers +▁solemn +▁solicit +▁solid +▁solitary +▁solitude +▁solomon +▁solution +▁some +▁somebody +▁somehow +▁someone +▁something +▁sometimes +▁somewhat +▁somewhere +▁son +▁song +▁soon +▁sooner +▁sooth +▁sorrow +▁sorry +▁sort +▁sought +▁soul +▁sound +▁source +▁south +▁southern +▁sovereign +▁sp +▁space +▁spain +▁spake +▁spaniard +▁spanish +▁spar +▁spare +▁spark +▁speak +▁speaking +▁spear +▁special +▁species +▁specimen +▁speck +▁spectacle +▁spectator +▁speculat +▁speech +▁speed +▁spell +▁spend +▁spent +▁sphere +▁spi +▁spin +▁spirit +▁spirits +▁spiritual +▁spite +▁splash +▁splendid +▁splendor +▁split +▁spoil +▁spoke +▁spoken +▁spoon +▁sport +▁spot +▁sprang +▁spread +▁spring +▁sprinkle +▁spur +▁squ +▁square +▁squee +▁squire +▁squirrel +▁st +▁sta +▁stable +▁staff +▁stage +▁stagger +▁staircase +▁stairs +▁stalk +▁stamp +▁stand +▁standard +▁standing +▁star +▁stared +▁stars +▁start +▁started +▁startled +▁state +▁statement +▁states +▁station +▁statue +▁stay +▁ste +▁steadily +▁steady +▁steal +▁steam +▁steel +▁steep +▁step +▁stephen +▁stepped +▁steps +▁stern +▁stick +▁stiff +▁still +▁stir +▁stirred +▁sto +▁stock +▁stole +▁stomach +▁stone +▁stones +▁stood +▁stooped +▁stop +▁stopped +▁stopping +▁store +▁stories +▁storm +▁story +▁stout +▁straight +▁strain +▁strait +▁strange +▁stranger +▁strap +▁strat +▁straw +▁stray +▁streak +▁stream +▁street +▁streets +▁strength +▁stretch +▁stretched +▁strew +▁stricken +▁strict +▁strike +▁striking +▁string +▁strip +▁stro +▁stroke +▁strong +▁struck +▁structure +▁struggle +▁struggling +▁stuck +▁student +▁studied +▁studies +▁studio +▁study +▁stuff +▁stumble +▁stump +▁stupid +▁style +▁su +▁sub +▁subdued +▁subject +▁sublime +▁submit +▁subsequent +▁substance +▁substantial +▁subtle +▁succeed +▁succeeded +▁success +▁successful +▁such +▁sudden +▁suddenly +▁suffer +▁suffered +▁suffering +▁suffice +▁sufficient +▁sufficiently +▁suffrage +▁sugar +▁suggest +▁suggested +▁suggestion +▁suit +▁sullen +▁sultan +▁sum +▁summer +▁summit +▁summon +▁sun +▁sunday +▁sunk +▁sunlight +▁sunrise +▁sunset +▁sunshine +▁super +▁superintend +▁superior +▁supper +▁supplied +▁supplies +▁supply +▁support +▁suppose +▁supposed +▁supposing +▁suppress +▁supreme +▁sur +▁sure +▁surely +▁surface +▁surgeon +▁surpass +▁surprise +▁surprised +▁surprising +▁surrender +▁surrounded +▁surrounding +▁survey +▁surviv +▁susan +▁suspect +▁suspicion +▁suspicious +▁sustain +▁sw +▁swa +▁swallow +▁swarm +▁swear +▁sweat +▁sweep +▁sweet +▁swell +▁swept +▁swift +▁swim +▁swimming +▁sword +▁swore +▁swung +▁sy +▁sylvia +▁symbol +▁sympathetic +▁sympathi +▁sympathy +▁symptom +▁system +▁t +▁ta +▁table +▁tail +▁take +▁taken +▁taking +▁tale +▁talent +▁talk +▁talked +▁talking +▁tall +▁tang +▁tank +▁tap +▁tar +▁task +▁taste +▁taught +▁tax +▁te +▁tea +▁teach +▁teacher +▁tear +▁tears +▁teeth +▁telegraph +▁telephone +▁tell +▁telling +▁temper +▁temperament +▁temperature +▁tempest +▁temple +▁temporary +▁tempt +▁temptation +▁ten +▁tendency +▁tender +▁tenderness +▁term +▁terms +▁terrace +▁terrible +▁terribly +▁terrified +▁territory +▁terror +▁test +▁testimony +▁text +▁th +▁than +▁thank +▁that +▁the +▁theatre +▁their +▁them +▁themselves +▁then +▁there +▁therefore +▁thereupon +▁these +▁they +▁thick +▁thief +▁thieves +▁thin +▁thing +▁things +▁think +▁thinking +▁third +▁thirst +▁thirteen +▁thirty +▁this +▁thither +▁thomas +▁thornton +▁thorough +▁thoroughly +▁those +▁thou +▁though +▁thought +▁thoughtfully +▁thoughts +▁thousand +▁thread +▁threat +▁threatened +▁threatening +▁three +▁threshold +▁threw +▁thrill +▁thro +▁throat +▁throne +▁throng +▁through +▁throughout +▁throw +▁throwing +▁thrown +▁thrust +▁thumb +▁thunder +▁thus +▁thy +▁thyself +▁ti +▁ticket +▁tide +▁tidings +▁tied +▁tight +▁till +▁timber +▁time +▁times +▁timid +▁tin +▁tiny +▁tip +▁tired +▁title +▁to +▁tobacco +▁today +▁together +▁told +▁tom +▁tomb +▁tomorrow +▁tone +▁tongue +▁too +▁took +▁top +▁torment +▁torrent +▁torture +▁total +▁touch +▁touched +▁toward +▁towards +▁tower +▁town +▁tra +▁trace +▁track +▁trade +▁tradition +▁tragedy +▁tragic +▁trail +▁train +▁traitor +▁tramp +▁tranquil +▁trans +▁transport +▁trap +▁travel +▁traveller +▁tre +▁tread +▁treasure +▁treat +▁treated +▁treatment +▁tree +▁trees +▁tremble +▁trembled +▁trembling +▁tremendous +▁trench +▁tri +▁trial +▁tribe +▁trick +▁tried +▁trifle +▁trifling +▁trip +▁tristram +▁triumph +▁triumphant +▁troop +▁troops +▁trot +▁trouble +▁troubled +▁trousers +▁trout +▁tru +▁true +▁truly +▁trumpet +▁trunk +▁trust +▁truth +▁try +▁trying +▁tu +▁tuesday +▁tulliver +▁tumble +▁tumult +▁turkey +▁turn +▁turned +▁turning +▁turtle +▁twas +▁twelve +▁twentieth +▁twenty +▁twice +▁twilight +▁twin +▁twist +▁two +▁type +▁tyrant +▁ugly +▁ultimate +▁umbrella +▁un +▁unable +▁unc +▁uncertain +▁uncle +▁uncomfortable +▁uncommon +▁unconscious +▁und +▁under +▁underneath +▁understand +▁understanding +▁understood +▁undertake +▁undertaking +▁undoubtedly +▁uneasiness +▁uneasy +▁unexpected +▁unfortunate +▁unhappy +▁uniform +▁union +▁united +▁universal +▁universe +▁university +▁unjust +▁unknown +▁unless +▁unlike +▁unnatural +▁unnecessary +▁unpleasant +▁unre +▁unseen +▁until +▁unto +▁unusual +▁unwilling +▁unworthy +▁up +▁upon +▁upper +▁upstairs +▁urge +▁us +▁use +▁used +▁useful +▁useless +▁usual +▁usually +▁utili +▁utmost +▁utter +▁uttered +▁utterly +▁va +▁vacant +▁vague +▁vain +▁val +▁valentine +▁valjean +▁valley +▁valuable +▁value +▁van +▁vanished +▁vari +▁variety +▁various +▁vast +▁vault +▁ve +▁vegetable +▁vehicle +▁veil +▁velvet +▁ven +▁vengeance +▁venture +▁ventured +▁ver +▁verse +▁very +▁vessel +▁vexed +▁vi +▁vibrat +▁vice +▁victim +▁victor +▁victory +▁view +▁vigorous +▁village +▁villain +▁villefort +▁vine +▁violence +▁violent +▁violet +▁virgin +▁virginia +▁virtue +▁virtuous +▁visible +▁vision +▁visit +▁visitor +▁vital +▁vivid +▁vo +▁voice +▁vol +▁volume +▁volunteer +▁vote +▁vow +▁voyage +▁vulgar +▁w +▁wa +▁wag +▁wagon +▁waist +▁waistcoat +▁wait +▁waited +▁waiting +▁wake +▁wal +▁walk +▁walked +▁walking +▁wall +▁walls +▁walter +▁wander +▁wandering +▁want +▁wanted +▁war +▁warm +▁warn +▁warning +▁warrant +▁warrior +▁was +▁wash +▁washington +▁watch +▁watched +▁watching +▁water +▁wave +▁waves +▁waving +▁wax +▁way +▁ways +▁we +▁weak +▁weakness +▁wealth +▁weapon +▁wear +▁weary +▁weather +▁wedding +▁week +▁weeks +▁weep +▁weigh +▁weight +▁welcome +▁welfare +▁well +▁went +▁wept +▁were +▁west +▁western +▁wh +▁whale +▁what +▁whatever +▁wheat +▁wheel +▁when +▁whence +▁where +▁wherefore +▁whereupon +▁whether +▁whi +▁which +▁while +▁whilst +▁whip +▁whirl +▁whisk +▁whisper +▁whispered +▁whistle +▁white +▁whither +▁who +▁whole +▁wholly +▁whom +▁whose +▁why +▁wi +▁wicked +▁wide +▁widow +▁wife +▁wild +▁wilderness +▁will +▁william +▁willing +▁wilson +▁wilt +▁win +▁wind +▁window +▁windows +▁wine +▁wings +▁winter +▁wip +▁wire +▁wisdom +▁wise +▁wish +▁wished +▁wishes +▁wit +▁witch +▁with +▁withdraw +▁withdrew +▁within +▁without +▁witness +▁wives +▁woe +▁woke +▁wolf +▁wolves +▁woman +▁women +▁won +▁wonder +▁wondered +▁wonderful +▁wondering +▁wood +▁wooden +▁woods +▁word +▁words +▁wore +▁work +▁worked +▁working +▁world +▁worm +▁worn +▁worried +▁worry +▁worse +▁worship +▁worst +▁worth +▁worthy +▁would +▁wouldn +▁wound +▁wounded +▁wrap +▁wrapped +▁wrath +▁wreck +▁wren +▁wretch +▁wretched +▁wrinkl +▁wrist +▁write +▁writer +▁writing +▁written +▁wrong +▁wrote +▁wrought +▁ya +▁yard +▁ye +▁year +▁years +▁yellow +▁yes +▁yesterday +▁yet +▁yield +▁yo +▁yonder +▁york +▁you +▁young +▁your +▁yourself +▁yourselves +▁youth + diff --git a/modules/audio/asr/u2_conformer_librispeech/module.py b/modules/audio/asr/u2_conformer_librispeech/module.py new file mode 100644 index 00000000..b98277f5 --- /dev/null +++ b/modules/audio/asr/u2_conformer_librispeech/module.py @@ -0,0 +1,74 @@ +# Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved. +# +# 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. + +import os +from pathlib import Path +import sys + +import numpy as np +from paddlehub.env import MODULE_HOME +from paddlehub.module.module import moduleinfo, serving +from paddlehub.utils.log import logger + +import paddle +import soundfile as sf + +# TODO: Remove system path when deepspeech can be installed via pip. +sys.path.append(os.path.join(MODULE_HOME, 'u2_conformer_librispeech')) +from deepspeech.exps.u2.config import get_cfg_defaults +from deepspeech.utils.utility import UpdateConfig +from .u2_conformer_tester import U2ConformerTester + + +@moduleinfo( + name="u2_conformer_librispeech", version="1.0.0", summary="", author="Baidu", author_email="", type="audio/asr") +class U2Conformer(paddle.nn.Layer): + def __init__(self): + super(U2Conformer, self).__init__() + + # resource + res_dir = os.path.join(MODULE_HOME, 'u2_conformer_librispeech', 'assets') + conf_file = os.path.join(res_dir, 'conf/conformer.yaml') + checkpoint = os.path.join(res_dir, 'checkpoints/avg_30.pdparams') + + # config + self.config = get_cfg_defaults() + self.config.merge_from_file(conf_file) + + # TODO: Remove path updating snippet. + with UpdateConfig(self.config): + self.config.collator.vocab_filepath = os.path.join(res_dir, self.config.collator.vocab_filepath) + self.config.collator.spm_model_prefix = os.path.join(res_dir, self.config.collator.spm_model_prefix) + self.config.collator.augmentation_config = os.path.join(res_dir, self.config.collator.augmentation_config) + self.config.model.cmvn_file = os.path.join(res_dir, self.config.model.cmvn_file) + self.config.decoding.decoding_method = 'attention_rescoring' + self.config.decoding.batch_size = 1 + + # model + self.tester = U2ConformerTester(self.config) + self.tester.setup_model() + self.tester.resume(checkpoint) + + @staticmethod + def check_audio(audio_file): + sig, sample_rate = sf.read(audio_file) + assert sample_rate == 16000, 'Excepting sample rate of input audio is 16000, but got {}'.format(sample_rate) + + @serving + def speech_recognize(self, audio_file, device='cpu'): + assert os.path.isfile(audio_file), 'File not exists: {}'.format(audio_file) + self.check_audio(audio_file) + + paddle.set_device(device) + return self.tester.test(audio_file)[0][0] diff --git a/modules/audio/asr/u2_conformer_librispeech/requirements.txt b/modules/audio/asr/u2_conformer_librispeech/requirements.txt new file mode 100644 index 00000000..49fb307f --- /dev/null +++ b/modules/audio/asr/u2_conformer_librispeech/requirements.txt @@ -0,0 +1,12 @@ +loguru +yacs +jsonlines +scipy==1.2.1 +sentencepiece +resampy==0.2.2 +SoundFile==0.9.0.post1 +soxbindings +kaldiio +typeguard +editdistance +textgrid diff --git a/modules/audio/asr/u2_conformer_librispeech/u2_conformer_tester.py b/modules/audio/asr/u2_conformer_librispeech/u2_conformer_tester.py new file mode 100644 index 00000000..c4f8d470 --- /dev/null +++ b/modules/audio/asr/u2_conformer_librispeech/u2_conformer_tester.py @@ -0,0 +1,80 @@ +# Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved. +# +# 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. +"""Evaluation for U2 model.""" +import os +import sys + +import paddle + +from deepspeech.frontend.featurizer.text_featurizer import TextFeaturizer +from deepspeech.io.collator import SpeechCollator +from deepspeech.models.u2 import U2Model +from deepspeech.utils import mp_tools +from deepspeech.utils.utility import UpdateConfig + + +class U2ConformerTester: + def __init__(self, config): + self.config = config + self.collate_fn_test = SpeechCollator.from_config(config) + self._text_featurizer = TextFeaturizer( + unit_type=config.collator.unit_type, vocab_filepath=None, spm_model_prefix=config.collator.spm_model_prefix) + + @mp_tools.rank_zero_only + @paddle.no_grad() + def test(self, audio_file): + self.model.eval() + cfg = self.config.decoding + collate_fn_test = self.collate_fn_test + audio, _ = collate_fn_test.process_utterance(audio_file=audio_file, transcript="Hello") + audio_len = audio.shape[0] + audio = paddle.to_tensor(audio, dtype='float32') + audio_len = paddle.to_tensor(audio_len) + audio = paddle.unsqueeze(audio, axis=0) + vocab_list = collate_fn_test.vocab_list + + text_feature = self.collate_fn_test.text_feature + result_transcripts = self.model.decode( + audio, + audio_len, + text_feature=text_feature, + decoding_method=cfg.decoding_method, + lang_model_path=cfg.lang_model_path, + beam_alpha=cfg.alpha, + beam_beta=cfg.beta, + beam_size=cfg.beam_size, + cutoff_prob=cfg.cutoff_prob, + cutoff_top_n=cfg.cutoff_top_n, + num_processes=cfg.num_proc_bsearch, + ctc_weight=cfg.ctc_weight, + decoding_chunk_size=cfg.decoding_chunk_size, + num_decoding_left_chunks=cfg.num_decoding_left_chunks, + simulate_streaming=cfg.simulate_streaming) + + return result_transcripts + + def setup_model(self): + config = self.config.clone() + with UpdateConfig(config): + config.model.input_dim = self.collate_fn_test.feature_size + config.model.output_dim = self.collate_fn_test.vocab_size + + self.model = U2Model.from_config(config.model) + + def resume(self, checkpoint): + """Resume from the checkpoint at checkpoints in the output + directory or load a specified checkpoint. + """ + model_dict = paddle.load(checkpoint) + self.model.set_state_dict(model_dict) diff --git a/modules/audio/audio_classification/PANNs/cnn10/README.md b/modules/audio/audio_classification/PANNs/cnn10/README.md index 9dd7c78f..c6ce4c55 100644 --- a/modules/audio/audio_classification/PANNs/cnn10/README.md +++ b/modules/audio/audio_classification/PANNs/cnn10/README.md @@ -1,68 +1,52 @@ -```shell -$ hub install panns_cnn10==1.0.0 -``` +# panns_cnn10 +|模型名称|panns_cnn10| +| :--- | :---: | +|类别|语音-声音分类| +|网络|PANNs| +|数据集|Google Audioset| +|是否支持Fine-tuning|是| +|模型大小|31MB| +|最新更新日期|2021-06-15| +|数据指标|mAP 0.380| + +## 一、模型基本信息 + +### 模型介绍 `panns_cnn10`是一个基于[Google Audioset](https://research.google.com/audioset/)数据集训练的声音分类/识别的模型。该模型主要包含8个卷积层和2个全连接层,模型参数为4.9M。经过预训练后,可以用于提取音频的embbedding,维度是512。 更多详情请参考论文:[PANNs: Large-Scale Pretrained Audio Neural Networks for Audio Pattern Recognition](https://arxiv.org/pdf/1912.10211.pdf) -## API -```python -def __init__( - task, - num_class=None, - label_map=None, - load_checkpoint=None, - **kwargs, -) -``` - -创建Module对象。 - -**参数** - -* `task`: 任务名称,可为`sound-cls`或者`None`。`sound-cls`代表声音分类任务,可以对声音分类的数据集进行finetune;为`None`时可以获取预训练模型对音频进行分类/Tagging。 -* `num_classes`:声音分类任务的类别数,finetune时需要指定,数值与具体使用的数据集类别数一致。 -* `label_map`:预测时的类别映射表。 -* `load_checkpoint`:使用PaddleHub Fine-tune api训练保存的模型参数文件路径。 -* `**kwargs`:用户额外指定的关键字字典类型的参数。 - -```python -def predict( - data, - sample_rate, - batch_size=1, - feat_type='mel', - use_gpu=False -) -``` +## 二、安装 + +- ### 1、环境依赖 + + - paddlepaddle >= 2.0.0 -**参数** + - paddlehub >= 2.0.0 | [如何安装PaddleHub](../../../../docs/docs_ch/get_start/installation.rst) -* `data`: 待预测数据,格式为\[waveform1, wavwform2…,\],其中每个元素都是一个一维numpy列表,是音频的波形采样数值列表。 -* `sample_rate`:音频文件的采样率。 -* `feat_type`:音频特征的种类选取,当前支持`'mel'`(详情可查看[Mel-frequency cepstrum](https://en.wikipedia.org/wiki/Mel-frequency_cepstrum))和原始波形特征`'raw'`。 -* `batch_size`:模型批处理大小。 -* `use_gpu`:是否使用gpu,默认为False。对于GPU用户,建议开启use_gpu。 +- ### 2、安装 -**返回** + - ```shell + $ hub install panns_cnn10 + ``` + - 如您安装时遇到问题,可参考:[零基础windows安装](../../../../docs/docs_ch/get_start/windows_quickstart.md) + | [零基础Linux安装](../../../../docs/docs_ch/get_start/linux_quickstart.md) | [零基础MacOS安装](../../../../docs/docs_ch/get_start/mac_quickstart.md) -* `results`:list类型,不同任务类型的返回结果如下 - * 声音分类(task参数为`sound-cls`):列表里包含每个音频文件的分类标签。 - * Tagging(task参数为`None`):列表里包含每个音频文件527个类别([Audioset标签](https://research.google.com/audioset/))的得分。 +## 三、模型API预测 -**代码示例** +- ### 1、预测代码示例 -- [ESC50](https://github.com/karolpiczak/ESC-50)声音分类预测 - ```python + - ```python + # ESC50声音分类预测 import librosa import paddlehub as hub from paddlehub.datasets import ESC50 sr = 44100 # 音频文件的采样率 - wav_file = '/data/cat.wav' # 用于预测的音频文件路径 + wav_file = '/PATH/TO/AUDIO' # 用于预测的音频文件路径 checkpoint = 'model.pdparams' # 用于预测的模型参数 label_map = {idx: label for idx, label in enumerate(ESC50.label_list)} @@ -86,8 +70,8 @@ def predict( print('File: {}\tLable: {}'.format(wav_file, result[0])) ``` -- Audioset Tagging - ```python + - ```python + # Audioset Tagging import librosa import numpy as np import paddlehub as hub @@ -105,7 +89,7 @@ def predict( print(msg) sr = 44100 # 音频文件的采样率 - wav_file = '/data/cat.wav' # 用于预测的音频文件路径 + wav_file = '/PATH/TO/AUDIO' # 用于预测的音频文件路径 label_file = './audioset_labels.txt' # audioset标签文本文件 topk = 10 # 展示的topk数 @@ -130,23 +114,58 @@ def predict( show_topk(topk, label_map, wav_file, result[0]) ``` -详情可参考PaddleHub示例: -- [AudioClassification](https://github.com/PaddlePaddle/PaddleHub/tree/release/v2.0/demo/audio_classification) - - -## 查看代码 - -https://github.com/qiuqiangkong/audioset_tagging_cnn +- ### 2、API + - ```python + def __init__( + task, + num_class=None, + label_map=None, + load_checkpoint=None, + **kwargs, + ) + ``` + - 创建Module对象。 + + - **参数** + - `task`: 任务名称,可为`sound-cls`或者`None`。`sound-cls`代表声音分类任务,可以对声音分类的数据集进行finetune;为`None`时可以获取预训练模型对音频进行分类/Tagging。 + - `num_classes`:声音分类任务的类别数,finetune时需要指定,数值与具体使用的数据集类别数一致。 + - `label_map`:预测时的类别映射表。 + - `load_checkpoint`:使用PaddleHub Fine-tune api训练保存的模型参数文件路径。 + - `**kwargs`:用户额外指定的关键字字典类型的参数。 + + - ```python + def predict( + data, + sample_rate, + batch_size=1, + feat_type='mel', + use_gpu=False + ) + ``` + - 模型预测,输入为音频波形数据,输出为分类标签。 -## 依赖 + - **参数** + - `data`: 待预测数据,格式为\[waveform1, wavwform2…,\],其中每个元素都是一个一维numpy列表,是音频的波形采样数值列表。 + - `sample_rate`:音频文件的采样率。 + - `feat_type`:音频特征的种类选取,当前支持`'mel'`(详情可查看[Mel-frequency cepstrum](https://en.wikipedia.org/wiki/Mel-frequency_cepstrum))和原始波形特征`'raw'`。 + - `batch_size`:模型批处理大小。 + - `use_gpu`:是否使用gpu,默认为False。对于GPU用户,建议开启use_gpu。 -paddlepaddle >= 2.0.0 + - **返回** + - `results`:list类型,不同任务类型的返回结果如下 + - 声音分类(task参数为`sound-cls`):列表里包含每个音频文件的分类标签。 + - Tagging(task参数为`None`):列表里包含每个音频文件527个类别([Audioset标签](https://research.google.com/audioset/))的得分。 -paddlehub >= 2.0.0 + 详情可参考PaddleHub示例: + - [AudioClassification](https://github.com/PaddlePaddle/PaddleHub/tree/release/v2.0/demo/audio_classification) -## 更新历史 +## 四、更新历史 * 1.0.0 初始发布,动态图版本模型,支持声音分类`sound-cls`任务的fine-tune和基于Audioset Tagging预测。 + + ```shell + $ hub install panns_cnn10 + ``` diff --git a/modules/audio/audio_classification/PANNs/cnn14/README.md b/modules/audio/audio_classification/PANNs/cnn14/README.md index adb66f9c..c65e7bea 100644 --- a/modules/audio/audio_classification/PANNs/cnn14/README.md +++ b/modules/audio/audio_classification/PANNs/cnn14/README.md @@ -1,68 +1,52 @@ -```shell -$ hub install panns_cnn14==1.0.0 -``` +# panns_cnn14 +|模型名称|panns_cnn14| +| :--- | :---: | +|类别|语音-声音分类| +|网络|PANNs| +|数据集|Google Audioset| +|是否支持Fine-tuning|是| +|模型大小|469MB| +|最新更新日期|2021-06-15| +|数据指标|mAP 0.431| + +## 一、模型基本信息 + +### 模型介绍 `panns_cnn14`是一个基于[Google Audioset](https://research.google.com/audioset/)数据集训练的声音分类/识别的模型。该模型主要包含12个卷积层和2个全连接层,模型参数为79.6M。经过预训练后,可以用于提取音频的embbedding,维度是2048。 更多详情请参考论文:[PANNs: Large-Scale Pretrained Audio Neural Networks for Audio Pattern Recognition](https://arxiv.org/pdf/1912.10211.pdf) -## API -```python -def __init__( - task, - num_class=None, - label_map=None, - load_checkpoint=None, - **kwargs, -) -``` - -创建Module对象。 - -**参数** - -* `task`: 任务名称,可为`sound-cls`或者`None`。`sound-cls`代表声音分类任务,可以对声音分类的数据集进行finetune;为`None`时可以获取预训练模型对音频进行分类/Tagging。 -* `num_classes`:声音分类任务的类别数,finetune时需要指定,数值与具体使用的数据集类别数一致。 -* `label_map`:预测时的类别映射表。 -* `load_checkpoint`:使用PaddleHub Fine-tune api训练保存的模型参数文件路径。 -* `**kwargs`:用户额外指定的关键字字典类型的参数。 - -```python -def predict( - data, - sample_rate, - batch_size=1, - feat_type='mel', - use_gpu=False -) -``` +## 二、安装 + +- ### 1、环境依赖 + + - paddlepaddle >= 2.0.0 -**参数** + - paddlehub >= 2.0.0 | [如何安装PaddleHub](../../../../docs/docs_ch/get_start/installation.rst) -* `data`: 待预测数据,格式为\[waveform1, wavwform2…,\],其中每个元素都是一个一维numpy列表,是音频的波形采样数值列表。 -* `sample_rate`:音频文件的采样率。 -* `feat_type`:音频特征的种类选取,当前支持`'mel'`(详情可查看[Mel-frequency cepstrum](https://en.wikipedia.org/wiki/Mel-frequency_cepstrum))和原始波形特征`'raw'`。 -* `batch_size`:模型批处理大小。 -* `use_gpu`:是否使用gpu,默认为False。对于GPU用户,建议开启use_gpu。 +- ### 2、安装 -**返回** + - ```shell + $ hub install panns_cnn14 + ``` + - 如您安装时遇到问题,可参考:[零基础windows安装](../../../../docs/docs_ch/get_start/windows_quickstart.md) + | [零基础Linux安装](../../../../docs/docs_ch/get_start/linux_quickstart.md) | [零基础MacOS安装](../../../../docs/docs_ch/get_start/mac_quickstart.md) -* `results`:list类型,不同任务类型的返回结果如下 - * 声音分类(task参数为`sound-cls`):列表里包含每个音频文件的分类标签。 - * Tagging(task参数为`None`):列表里包含每个音频文件527个类别([Audioset标签](https://research.google.com/audioset/))的得分。 +## 三、模型API预测 -**代码示例** +- ### 1、预测代码示例 -- [ESC50](https://github.com/karolpiczak/ESC-50)声音分类预测 - ```python + - ```python + # ESC50声音分类预测 import librosa import paddlehub as hub from paddlehub.datasets import ESC50 sr = 44100 # 音频文件的采样率 - wav_file = '/data/cat.wav' # 用于预测的音频文件路径 + wav_file = '/PATH/TO/AUDIO' # 用于预测的音频文件路径 checkpoint = 'model.pdparams' # 用于预测的模型参数 label_map = {idx: label for idx, label in enumerate(ESC50.label_list)} @@ -86,8 +70,8 @@ def predict( print('File: {}\tLable: {}'.format(wav_file, result[0])) ``` -- Audioset Tagging - ```python + - ```python + # Audioset Tagging import librosa import numpy as np import paddlehub as hub @@ -105,7 +89,7 @@ def predict( print(msg) sr = 44100 # 音频文件的采样率 - wav_file = '/data/cat.wav' # 用于预测的音频文件路径 + wav_file = '/PATH/TO/AUDIO' # 用于预测的音频文件路径 label_file = './audioset_labels.txt' # audioset标签文本文件 topk = 10 # 展示的topk数 @@ -130,23 +114,58 @@ def predict( show_topk(topk, label_map, wav_file, result[0]) ``` -详情可参考PaddleHub示例: -- [AudioClassification](https://github.com/PaddlePaddle/PaddleHub/tree/release/v2.0/demo/audio_classification) - - -## 查看代码 - -https://github.com/qiuqiangkong/audioset_tagging_cnn +- ### 2、API + - ```python + def __init__( + task, + num_class=None, + label_map=None, + load_checkpoint=None, + **kwargs, + ) + ``` + - 创建Module对象。 + + - **参数** + - `task`: 任务名称,可为`sound-cls`或者`None`。`sound-cls`代表声音分类任务,可以对声音分类的数据集进行finetune;为`None`时可以获取预训练模型对音频进行分类/Tagging。 + - `num_classes`:声音分类任务的类别数,finetune时需要指定,数值与具体使用的数据集类别数一致。 + - `label_map`:预测时的类别映射表。 + - `load_checkpoint`:使用PaddleHub Fine-tune api训练保存的模型参数文件路径。 + - `**kwargs`:用户额外指定的关键字字典类型的参数。 + + - ```python + def predict( + data, + sample_rate, + batch_size=1, + feat_type='mel', + use_gpu=False + ) + ``` + - 模型预测,输入为音频波形数据,输出为分类标签。 -## 依赖 + - **参数** + - `data`: 待预测数据,格式为\[waveform1, wavwform2…,\],其中每个元素都是一个一维numpy列表,是音频的波形采样数值列表。 + - `sample_rate`:音频文件的采样率。 + - `feat_type`:音频特征的种类选取,当前支持`'mel'`(详情可查看[Mel-frequency cepstrum](https://en.wikipedia.org/wiki/Mel-frequency_cepstrum))和原始波形特征`'raw'`。 + - `batch_size`:模型批处理大小。 + - `use_gpu`:是否使用gpu,默认为False。对于GPU用户,建议开启use_gpu。 -paddlepaddle >= 2.0.0 + - **返回** + - `results`:list类型,不同任务类型的返回结果如下 + - 声音分类(task参数为`sound-cls`):列表里包含每个音频文件的分类标签。 + - Tagging(task参数为`None`):列表里包含每个音频文件527个类别([Audioset标签](https://research.google.com/audioset/))的得分。 -paddlehub >= 2.0.0 + 详情可参考PaddleHub示例: + - [AudioClassification](https://github.com/PaddlePaddle/PaddleHub/tree/release/v2.0/demo/audio_classification) -## 更新历史 +## 四、更新历史 * 1.0.0 初始发布,动态图版本模型,支持声音分类`sound-cls`任务的fine-tune和基于Audioset Tagging预测。 + + ```shell + $ hub install panns_cnn14 + ``` diff --git a/modules/audio/audio_classification/PANNs/cnn6/README.md b/modules/audio/audio_classification/PANNs/cnn6/README.md index dd10c0b2..0e8b9442 100644 --- a/modules/audio/audio_classification/PANNs/cnn6/README.md +++ b/modules/audio/audio_classification/PANNs/cnn6/README.md @@ -1,68 +1,52 @@ -```shell -$ hub install panns_cnn6==1.0.0 -``` +# panns_cnn6 +|模型名称|panns_cnn6| +| :--- | :---: | +|类别|语音-声音分类| +|网络|PANNs| +|数据集|Google Audioset| +|是否支持Fine-tuning|是| +|模型大小|29MB| +|最新更新日期|2021-06-15| +|数据指标|mAP 0.343| -`panns_cnn6`是一个基于[Google Audioset](https://research.google.com/audioset/)数据集训练的声音分类/识别的模型。该模型主要包含4个卷积层和2个全连接层,模型参数为4.5M。经过预训练后,可以用于提取音频的embbedding,维度是512。 +## 一、模型基本信息 -更多详情请参考论文:[PANNs: Large-Scale Pretrained Audio Neural Networks for Audio Pattern Recognition](https://arxiv.org/pdf/1912.10211.pdf) +### 模型介绍 -## API -```python -def __init__( - task, - num_class=None, - label_map=None, - load_checkpoint=None, - **kwargs, -) -``` +`panns_cnn6`是一个基于[Google Audioset](https://research.google.com/audioset/)数据集训练的声音分类/识别的模型。该模型主要包含4个卷积层和2个全连接层,模型参数为4.5M。经过预训练后,可以用于提取音频的embbedding,维度是512。 -创建Module对象。 +更多详情请参考:[PANNs: Large-Scale Pretrained Audio Neural Networks for Audio Pattern Recognition](https://arxiv.org/pdf/1912.10211.pdf) -**参数** +## 二、安装 -* `task`: 任务名称,可为`sound-cls`或者`None`。`sound-cls`代表声音分类任务,可以对声音分类的数据集进行finetune;为`None`时可以获取预训练模型对音频进行分类/Tagging。 -* `num_classes`:声音分类任务的类别数,finetune时需要指定,数值与具体使用的数据集类别数一致。 -* `label_map`:预测时的类别映射表。 -* `load_checkpoint`:使用PaddleHub Fine-tune api训练保存的模型参数文件路径。 -* `**kwargs`:用户额外指定的关键字字典类型的参数。 +- ### 1、环境依赖 -```python -def predict( - data, - sample_rate, - batch_size=1, - feat_type='mel', - use_gpu=False -) -``` + - paddlepaddle >= 2.0.0 -**参数** + - paddlehub >= 2.0.0 | [如何安装PaddleHub](../../../../docs/docs_ch/get_start/installation.rst) -* `data`: 待预测数据,格式为\[waveform1, wavwform2…,\],其中每个元素都是一个一维numpy列表,是音频的波形采样数值列表。 -* `sample_rate`:音频文件的采样率。 -* `feat_type`:音频特征的种类选取,当前支持`'mel'`(详情可查看[Mel-frequency cepstrum](https://en.wikipedia.org/wiki/Mel-frequency_cepstrum))和原始波形特征`'raw'`。 -* `batch_size`:模型批处理大小。 -* `use_gpu`:是否使用gpu,默认为False。对于GPU用户,建议开启use_gpu。 +- ### 2、安装 -**返回** + - ```shell + $ hub install panns_cnn6 + ``` + - 如您安装时遇到问题,可参考:[零基础windows安装](../../../../docs/docs_ch/get_start/windows_quickstart.md) + | [零基础Linux安装](../../../../docs/docs_ch/get_start/linux_quickstart.md) | [零基础MacOS安装](../../../../docs/docs_ch/get_start/mac_quickstart.md) -* `results`:list类型,不同任务类型的返回结果如下 - * 声音分类(task参数为`sound-cls`):列表里包含每个音频文件的分类标签。 - * Tagging(task参数为`None`):列表里包含每个音频文件527个类别([Audioset标签](https://research.google.com/audioset/))的得分。 +## 三、模型API预测 -**代码示例** +- ### 1、预测代码示例 -- [ESC50](https://github.com/karolpiczak/ESC-50)声音分类预测 - ```python + - ```python + # ESC50声音分类预测 import librosa import paddlehub as hub from paddlehub.datasets import ESC50 sr = 44100 # 音频文件的采样率 - wav_file = '/data/cat.wav' # 用于预测的音频文件路径 + wav_file = '/PATH/TO/AUDIO' # 用于预测的音频文件路径 checkpoint = 'model.pdparams' # 用于预测的模型参数 label_map = {idx: label for idx, label in enumerate(ESC50.label_list)} @@ -86,8 +70,8 @@ def predict( print('File: {}\tLable: {}'.format(wav_file, result[0])) ``` -- Audioset Tagging - ```python + - ```python + # Audioset Tagging import librosa import numpy as np import paddlehub as hub @@ -105,7 +89,7 @@ def predict( print(msg) sr = 44100 # 音频文件的采样率 - wav_file = '/data/cat.wav' # 用于预测的音频文件路径 + wav_file = '/PATH/TO/AUDIO' # 用于预测的音频文件路径 label_file = './audioset_labels.txt' # audioset标签文本文件 topk = 10 # 展示的topk数 @@ -130,23 +114,58 @@ def predict( show_topk(topk, label_map, wav_file, result[0]) ``` -详情可参考PaddleHub示例: -- [AudioClassification](https://github.com/PaddlePaddle/PaddleHub/tree/release/v2.0/demo/audio_classification) - - -## 查看代码 - -https://github.com/qiuqiangkong/audioset_tagging_cnn +- ### 2、API + - ```python + def __init__( + task, + num_class=None, + label_map=None, + load_checkpoint=None, + **kwargs, + ) + ``` + - 创建Module对象。 + + - **参数** + - `task`: 任务名称,可为`sound-cls`或者`None`。`sound-cls`代表声音分类任务,可以对声音分类的数据集进行finetune;为`None`时可以获取预训练模型对音频进行分类/Tagging。 + - `num_classes`:声音分类任务的类别数,finetune时需要指定,数值与具体使用的数据集类别数一致。 + - `label_map`:预测时的类别映射表。 + - `load_checkpoint`:使用PaddleHub Fine-tune api训练保存的模型参数文件路径。 + - `**kwargs`:用户额外指定的关键字字典类型的参数。 + + - ```python + def predict( + data, + sample_rate, + batch_size=1, + feat_type='mel', + use_gpu=False + ) + ``` + - 模型预测,输入为音频波形数据,输出为分类标签。 -## 依赖 + - **参数** + - `data`: 待预测数据,格式为\[waveform1, wavwform2…,\],其中每个元素都是一个一维numpy列表,是音频的波形采样数值列表。 + - `sample_rate`:音频文件的采样率。 + - `feat_type`:音频特征的种类选取,当前支持`'mel'`(详情可查看[Mel-frequency cepstrum](https://en.wikipedia.org/wiki/Mel-frequency_cepstrum))和原始波形特征`'raw'`。 + - `batch_size`:模型批处理大小。 + - `use_gpu`:是否使用gpu,默认为False。对于GPU用户,建议开启use_gpu。 -paddlepaddle >= 2.0.0 + - **返回** + - `results`:list类型,不同任务类型的返回结果如下 + - 声音分类(task参数为`sound-cls`):列表里包含每个音频文件的分类标签。 + - Tagging(task参数为`None`):列表里包含每个音频文件527个类别([Audioset标签](https://research.google.com/audioset/))的得分。 -paddlehub >= 2.0.0 + 详情可参考PaddleHub示例: + - [AudioClassification](https://github.com/PaddlePaddle/PaddleHub/tree/release/v2.0/demo/audio_classification) -## 更新历史 +## 四、更新历史 * 1.0.0 初始发布,动态图版本模型,支持声音分类`sound-cls`任务的fine-tune和基于Audioset Tagging预测。 + + ```shell + $ hub install panns_cnn6 + ``` diff --git a/modules/audio/tts/fastspeech2_baker/README.md b/modules/audio/tts/fastspeech2_baker/README.md new file mode 100644 index 00000000..1ec244d6 --- /dev/null +++ b/modules/audio/tts/fastspeech2_baker/README.md @@ -0,0 +1,156 @@ +# fastspeech2_baker + +|模型名称|fastspeech2_baker| +| :--- | :---: | +|类别|语音-语音合成| +|网络|FastSpeech2| +|数据集|Chinese Standard Mandarin Speech Copus| +|是否支持Fine-tuning|否| +|模型大小|621MB| +|最新更新日期|2021-10-20| +|数据指标|-| + +## 一、模型基本信息 + +### 模型介绍 + +FastSpeech2是微软亚洲研究院和微软Azure语音团队联合浙江大学于2020年提出的语音合成(Text to Speech, TTS)模型。FastSpeech2是FastSpeech的改进版,解决了FastSpeech依赖Teacher-Student的知识蒸馏框架,训练流程比较复杂和训练目标相比真实语音存在信息损失的问题。 + +FastSpeech2的模型架构如下图所示,它沿用FastSpeech中提出的Feed-Forward Transformer(FFT)架构,但在音素编码器和梅尔频谱解码器中加入了一个可变信息适配器(Variance Adaptor),从而支持在FastSpeech2中引入更多语音中变化的信息,例如时长、音高、音量(频谱能量)等,来解决语音合成中的一对多映射问题。 + +

+
+

+ +Parallel WaveGAN是一种使用了无蒸馏的对抗生成网络,快速且占用空间小的波形生成方法。该方法通过联合优化多分辨率谱图和对抗损失函数来训练非自回归WaveNet,可以有效捕获真实语音波形的时频分布。Parallel WaveGAN的结构如下图所示: + +

+
+

+ +fastspeech2_baker使用了FastSpeech2作为声学模型,使用Parallel WaveGAN作为声码器,并在[中文标准女声音库(Chinese Standard Mandarin Speech Copus)](https://www.data-baker.com/open_source.html)数据集上进行了预训练,可直接用于预测合成音频。 + +更多详情请参考: +- [FastSpeech 2: Fast and High-Quality End-to-End Text-to-Speech](https://arxiv.org/abs/2006.04558) +- [FastSpeech语音合成系统技术升级,微软联合浙大提出FastSpeech2](https://www.msra.cn/zh-cn/news/features/fastspeech2) +- [Parallel WaveGAN: A fast waveform generation model based on generative adversarial networks with multi-resolution spectrogram](https://arxiv.org/abs/1910.11480) + +## 二、安装 + +- ### 1、环境依赖 + + - paddlepaddle >= 2.1.0 + + - paddlehub >= 2.1.0 | [如何安装PaddleHub](../../../../docs/docs_ch/get_start/installation.rst) + +- ### 2、安装 + + - ```shell + $ hub install fastspeech2_baker + ``` + - 如您安装时遇到问题,可参考:[零基础windows安装](../../../../docs/docs_ch/get_start/windows_quickstart.md) + | [零基础Linux安装](../../../../docs/docs_ch/get_start/linux_quickstart.md) | [零基础MacOS安装](../../../../docs/docs_ch/get_start/mac_quickstart.md) + + +## 三、模型API预测 + +- ### 1、预测代码示例 + + ```python + import paddlehub as hub + + # 需要合成语音的文本 + sentences = ['这是一段测试语音合成的音频。'] + + model = hub.Module( + name='fastspeech2_baker', + version='1.0.0') + wav_files = model.generate(sentences) + + # 打印合成的音频文件的路径 + print(wav_files) + ``` + + 详情可参考PaddleHub示例: + - [语音合成](../../../../demo/text_to_speech) + + +- ### 2、API + - ```python + def __init__(output_dir) + ``` + + - 创建Module对象(动态图组网版本) + + - **参数** + + - `output_dir`: 合成音频文件的输出目录。 + + - ```python + def generate( + sentences, + device='cpu', + ) + ``` + - 将输入的文本合成为音频文件并保存到输出目录。 + + - **参数** + + - `sentences`:合成音频的文本列表,类型为`List[str]`。 + - `device`:预测时使用的设备,默认为`cpu`,如需使用gpu预测,请设置为`gpu`。 + + - **返回** + + - `wav_files`:`List[str]`类型,返回合成音频的存放路径。 + + +## 四、服务部署 + +- PaddleHub Serving可以部署一个在线的语音识别服务。 + +- ### 第一步:启动PaddleHub Serving + + - ```shell + $ hub serving start -m fastspeech2_baker + ``` + + - 这样就完成了一个语音识别服务化API的部署,默认端口号为8866。 + + - **NOTE:** 如使用GPU预测,则需要在启动服务之前,请设置CUDA_VISIBLE_DEVICES环境变量,否则不用设置。 + +- ### 第二步:发送预测请求 + + - 配置好服务端,以下数行代码即可实现发送预测请求,获取预测结果 + + - ```python + import requests + import json + + # 需要合成语音的文本 + sentences = [ + '这是第一段测试语音合成的音频。', + '这是第二段测试语音合成的音频。', + ] + + # 以key的方式指定text传入预测方法的时的参数,此例中为"sentences" + data = {"sentences": sentences} + + # 发送post请求,content-type类型应指定json方式,url中的ip地址需改为对应机器的ip + url = "http://127.0.0.1:8866/predict/fastspeech2_baker" + + # 指定post请求的headers为application/json方式 + headers = {"Content-Type": "application/json"} + + r = requests.post(url=url, headers=headers, data=json.dumps(data)) + print(r.json()) + ``` + +## 五、更新历史 + +* 1.0.0 + + 初始发布 + + ```shell + $ hub install fastspeech2_baker + ``` diff --git a/modules/audio/tts/fastspeech2_baker/__init__.py b/modules/audio/tts/fastspeech2_baker/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/modules/audio/tts/fastspeech2_baker/assets/fastspeech2_nosil_baker_ckpt_0.4/default.yaml b/modules/audio/tts/fastspeech2_baker/assets/fastspeech2_nosil_baker_ckpt_0.4/default.yaml new file mode 100644 index 00000000..63eaef16 --- /dev/null +++ b/modules/audio/tts/fastspeech2_baker/assets/fastspeech2_nosil_baker_ckpt_0.4/default.yaml @@ -0,0 +1,104 @@ +########################################################### +# FEATURE EXTRACTION SETTING # +########################################################### + +fs: 24000 # sr +n_fft: 2048 # FFT size. +n_shift: 300 # Hop size. +win_length: 1200 # Window length. + # If set to null, it will be the same as fft_size. +window: "hann" # Window function. + +# Only used for feats_type != raw + +fmin: 80 # Minimum frequency of Mel basis. +fmax: 7600 # Maximum frequency of Mel basis. +n_mels: 80 # The number of mel basis. + +# Only used for the model using pitch features (e.g. FastSpeech2) +f0min: 80 # Maximum f0 for pitch extraction. +f0max: 400 # Minimum f0 for pitch extraction. + + +########################################################### +# DATA SETTING # +########################################################### +batch_size: 64 +num_workers: 4 + + +########################################################### +# MODEL SETTING # +########################################################### +model: + adim: 384 # attention dimension + aheads: 2 # number of attention heads + elayers: 4 # number of encoder layers + eunits: 1536 # number of encoder ff units + dlayers: 4 # number of decoder layers + dunits: 1536 # number of decoder ff units + positionwise_layer_type: conv1d # type of position-wise layer + positionwise_conv_kernel_size: 3 # kernel size of position wise conv layer + duration_predictor_layers: 2 # number of layers of duration predictor + duration_predictor_chans: 256 # number of channels of duration predictor + duration_predictor_kernel_size: 3 # filter size of duration predictor + postnet_layers: 5 # number of layers of postnset + postnet_filts: 5 # filter size of conv layers in postnet + postnet_chans: 256 # number of channels of conv layers in postnet + use_masking: True # whether to apply masking for padded part in loss calculation + use_scaled_pos_enc: True # whether to use scaled positional encoding + encoder_normalize_before: True # whether to perform layer normalization before the input + decoder_normalize_before: True # whether to perform layer normalization before the input + reduction_factor: 1 # reduction factor + init_type: xavier_uniform # initialization type + init_enc_alpha: 1.0 # initial value of alpha of encoder scaled position encoding + init_dec_alpha: 1.0 # initial value of alpha of decoder scaled position encoding + transformer_enc_dropout_rate: 0.2 # dropout rate for transformer encoder layer + transformer_enc_positional_dropout_rate: 0.2 # dropout rate for transformer encoder positional encoding + transformer_enc_attn_dropout_rate: 0.2 # dropout rate for transformer encoder attention layer + transformer_dec_dropout_rate: 0.2 # dropout rate for transformer decoder layer + transformer_dec_positional_dropout_rate: 0.2 # dropout rate for transformer decoder positional encoding + transformer_dec_attn_dropout_rate: 0.2 # dropout rate for transformer decoder attention layer + pitch_predictor_layers: 5 # number of conv layers in pitch predictor + pitch_predictor_chans: 256 # number of channels of conv layers in pitch predictor + pitch_predictor_kernel_size: 5 # kernel size of conv leyers in pitch predictor + pitch_predictor_dropout: 0.5 # dropout rate in pitch predictor + pitch_embed_kernel_size: 1 # kernel size of conv embedding layer for pitch + pitch_embed_dropout: 0.0 # dropout rate after conv embedding layer for pitch + stop_gradient_from_pitch_predictor: true # whether to stop the gradient from pitch predictor to encoder + energy_predictor_layers: 2 # number of conv layers in energy predictor + energy_predictor_chans: 256 # number of channels of conv layers in energy predictor + energy_predictor_kernel_size: 3 # kernel size of conv leyers in energy predictor + energy_predictor_dropout: 0.5 # dropout rate in energy predictor + energy_embed_kernel_size: 1 # kernel size of conv embedding layer for energy + energy_embed_dropout: 0.0 # dropout rate after conv embedding layer for energy + stop_gradient_from_energy_predictor: false # whether to stop the gradient from energy predictor to encoder + + + +########################################################### +# UPDATER SETTING # +########################################################### +updater: + use_masking: True # whether to apply masking for padded part in loss calculation + + + +########################################################### +# OPTIMIZER SETTING # +########################################################### +optimizer: + optim: adam # optimizer type + learning_rate: 0.001 # learning rate + +########################################################### +# TRAINING SETTING # +########################################################### +max_epoch: 1000 +num_snapshots: 5 + + +########################################################### +# OTHER SETTING # +########################################################### +seed: 10086 diff --git a/modules/audio/tts/fastspeech2_baker/assets/fastspeech2_nosil_baker_ckpt_0.4/phone_id_map.txt b/modules/audio/tts/fastspeech2_baker/assets/fastspeech2_nosil_baker_ckpt_0.4/phone_id_map.txt new file mode 100644 index 00000000..a7ca3402 --- /dev/null +++ b/modules/audio/tts/fastspeech2_baker/assets/fastspeech2_nosil_baker_ckpt_0.4/phone_id_map.txt @@ -0,0 +1,268 @@ + 0 + 1 +a1 2 +a2 3 +a3 4 +a4 5 +a5 6 +ai1 7 +ai2 8 +ai3 9 +ai4 10 +ai5 11 +air2 12 +air4 13 +an1 14 +an2 15 +an3 16 +an4 17 +an5 18 +ang1 19 +ang2 20 +ang3 21 +ang4 22 +ang5 23 +anr1 24 +anr3 25 +anr4 26 +ao1 27 +ao2 28 +ao3 29 +ao4 30 +ao5 31 +aor3 32 +aor4 33 +ar2 34 +ar3 35 +ar4 36 +b 37 +c 38 +ch 39 +d 40 +e1 41 +e2 42 +e3 43 +e4 44 +e5 45 +ei1 46 +ei2 47 +ei3 48 +ei4 49 +ei5 50 +en1 51 +en2 52 +en3 53 +en4 54 +en5 55 +eng1 56 +eng2 57 +eng3 58 +eng4 59 +eng5 60 +enr1 61 +enr2 62 +enr4 63 +enr5 64 +er2 65 +er3 66 +er4 67 +er5 68 +f 69 +g 70 +h 71 +i1 72 +i2 73 +i3 74 +i4 75 +i5 76 +ia1 77 +ia2 78 +ia3 79 +ia4 80 +ia5 81 +ian1 82 +ian2 83 +ian3 84 +ian4 85 +ian5 86 +iang1 87 +iang2 88 +iang3 89 +iang4 90 +iang5 91 +iangr4 92 +ianr1 93 +ianr2 94 +ianr3 95 +iao1 96 +iao2 97 +iao3 98 +iao4 99 +iao5 100 +iar1 101 +iar3 102 +ie1 103 +ie2 104 +ie3 105 +ie4 106 +ie5 107 +ii1 108 +ii2 109 +ii3 110 +ii4 111 +ii5 112 +iii1 113 +iii2 114 +iii3 115 +iii4 116 +iii5 117 +iiir4 118 +iir2 119 +in1 120 +in2 121 +in3 122 +in4 123 +in5 124 +ing1 125 +ing2 126 +ing3 127 +ing4 128 +ing5 129 +ingr2 130 +ingr3 131 +inr4 132 +io1 133 +io5 134 +iong1 135 +iong2 136 +iong3 137 +iong4 138 +iong5 139 +iou1 140 +iou2 141 +iou3 142 +iou4 143 +iou5 144 +iour1 145 +ir1 146 +ir2 147 +ir3 148 +ir4 149 +ir5 150 +j 151 +k 152 +l 153 +m 154 +n 155 +o1 156 +o2 157 +o3 158 +o4 159 +o5 160 +ong1 161 +ong2 162 +ong3 163 +ong4 164 +ong5 165 +ongr4 166 +ou1 167 +ou2 168 +ou3 169 +ou4 170 +ou5 171 +our2 172 +p 173 +q 174 +r 175 +s 176 +sh 177 +sil 178 +sp 179 +spl 180 +spn 181 +t 182 +u1 183 +u2 184 +u3 185 +u4 186 +u5 187 +ua1 188 +ua2 189 +ua3 190 +ua4 191 +ua5 192 +uai1 193 +uai2 194 +uai3 195 +uai4 196 +uai5 197 +uair4 198 +uan1 199 +uan2 200 +uan3 201 +uan4 202 +uan5 203 +uang1 204 +uang2 205 +uang3 206 +uang4 207 +uang5 208 +uanr1 209 +uanr2 210 +uei1 211 +uei2 212 +uei3 213 +uei4 214 +uei5 215 +ueir1 216 +ueir3 217 +ueir4 218 +uen1 219 +uen2 220 +uen3 221 +uen4 222 +uen5 223 +ueng1 224 +ueng2 225 +ueng3 226 +ueng4 227 +uenr3 228 +uenr4 229 +uo1 230 +uo2 231 +uo3 232 +uo4 233 +uo5 234 +uor2 235 +uor3 236 +ur3 237 +ur4 238 +v1 239 +v2 240 +v3 241 +v4 242 +v5 243 +van1 244 +van2 245 +van3 246 +van4 247 +van5 248 +vanr4 249 +ve1 250 +ve2 251 +ve3 252 +ve4 253 +ve5 254 +vn1 255 +vn2 256 +vn3 257 +vn4 258 +vn5 259 +x 260 +z 261 +zh 262 +, 263 +。 264 +? 265 +! 266 + 267 diff --git a/modules/audio/tts/fastspeech2_baker/assets/pwg_baker_ckpt_0.4/pwg_default.yaml b/modules/audio/tts/fastspeech2_baker/assets/pwg_baker_ckpt_0.4/pwg_default.yaml new file mode 100644 index 00000000..17edbc25 --- /dev/null +++ b/modules/audio/tts/fastspeech2_baker/assets/pwg_baker_ckpt_0.4/pwg_default.yaml @@ -0,0 +1,128 @@ +# This is the hyperparameter configuration file for Parallel WaveGAN. +# Please make sure this is adjusted for the CSMSC dataset. If you want to +# apply to the other dataset, you might need to carefully change some parameters. +# This configuration requires 12 GB GPU memory and takes ~3 days on RTX TITAN. + +########################################################### +# FEATURE EXTRACTION SETTING # +########################################################### +fs: 24000 # Sampling rate. +n_fft: 2048 # FFT size. (in samples) +n_shift: 300 # Hop size. (in samples) +win_length: 1200 # Window length. (in samples) + # If set to null, it will be the same as fft_size. +window: "hann" # Window function. +n_mels: 80 # Number of mel basis. +fmin: 80 # Minimum freq in mel basis calculation. +fmax: 7600 # Maximum frequency in mel basis calculation. +# global_gain_scale: 1.0 # Will be multiplied to all of waveform. +trim_silence: false # Whether to trim the start and end of silence. +top_db: 60 # Need to tune carefully if the recording is not good. +trim_frame_length: 2048 # Frame size in trimming.(in samples) +trim_hop_length: 512 # Hop size in trimming.(in samples) + +########################################################### +# GENERATOR NETWORK ARCHITECTURE SETTING # +########################################################### +generator_params: + in_channels: 1 # Number of input channels. + out_channels: 1 # Number of output channels. + kernel_size: 3 # Kernel size of dilated convolution. + layers: 30 # Number of residual block layers. + stacks: 3 # Number of stacks i.e., dilation cycles. + residual_channels: 64 # Number of channels in residual conv. + gate_channels: 128 # Number of channels in gated conv. + skip_channels: 64 # Number of channels in skip conv. + aux_channels: 80 # Number of channels for auxiliary feature conv. + # Must be the same as num_mels. + aux_context_window: 2 # Context window size for auxiliary feature. + # If set to 2, previous 2 and future 2 frames will be considered. + dropout: 0.0 # Dropout rate. 0.0 means no dropout applied. + bias: true # use bias in residual blocks + use_weight_norm: true # Whether to use weight norm. + # If set to true, it will be applied to all of the conv layers. + use_causal_conv: false # use causal conv in residual blocks and upsample layers + # upsample_net: "ConvInUpsampleNetwork" # Upsampling network architecture. + upsample_scales: [4, 5, 3, 5] # Upsampling scales. Prodcut of these must be the same as hop size. + interpolate_mode: "nearest" # upsample net interpolate mode + freq_axis_kernel_size: 1 # upsamling net: convolution kernel size in frequencey axis + nonlinear_activation: null + nonlinear_activation_params: {} + +########################################################### +# DISCRIMINATOR NETWORK ARCHITECTURE SETTING # +########################################################### +discriminator_params: + in_channels: 1 # Number of input channels. + out_channels: 1 # Number of output channels. + kernel_size: 3 # Number of output channels. + layers: 10 # Number of conv layers. + conv_channels: 64 # Number of chnn layers. + bias: true # Whether to use bias parameter in conv. + use_weight_norm: true # Whether to use weight norm. + # If set to true, it will be applied to all of the conv layers. + nonlinear_activation: "LeakyReLU" # Nonlinear function after each conv. + nonlinear_activation_params: # Nonlinear function parameters + negative_slope: 0.2 # Alpha in LeakyReLU. + +########################################################### +# STFT LOSS SETTING # +########################################################### +stft_loss_params: + fft_sizes: [1024, 2048, 512] # List of FFT size for STFT-based loss. + hop_sizes: [120, 240, 50] # List of hop size for STFT-based loss + win_lengths: [600, 1200, 240] # List of window length for STFT-based loss. + window: "hann" # Window function for STFT-based loss + +########################################################### +# ADVERSARIAL LOSS SETTING # +########################################################### +lambda_adv: 4.0 # Loss balancing coefficient. + +########################################################### +# DATA LOADER SETTING # +########################################################### +batch_size: 6 # Batch size. +batch_max_steps: 25500 # Length of each audio in batch. Make sure dividable by hop_size. +pin_memory: true # Whether to pin memory in Pytorch DataLoader. +num_workers: 4 # Number of workers in Pytorch DataLoader. +remove_short_samples: true # Whether to remove samples the length of which are less than batch_max_steps. +allow_cache: true # Whether to allow cache in dataset. If true, it requires cpu memory. + +########################################################### +# OPTIMIZER & SCHEDULER SETTING # +########################################################### +generator_optimizer_params: + epsilon: 1.0e-6 # Generator's epsilon. + weight_decay: 0.0 # Generator's weight decay coefficient. +generator_scheduler_params: + learning_rate: 0.0001 # Generator's learning rate. + step_size: 200000 # Generator's scheduler step size. + gamma: 0.5 # Generator's scheduler gamma. + # At each step size, lr will be multiplied by this parameter. +generator_grad_norm: 10 # Generator's gradient norm. +discriminator_optimizer_params: + epsilon: 1.0e-6 # Discriminator's epsilon. + weight_decay: 0.0 # Discriminator's weight decay coefficient. +discriminator_scheduler_params: + learning_rate: 0.00005 # Discriminator's learning rate. + step_size: 200000 # Discriminator's scheduler step size. + gamma: 0.5 # Discriminator's scheduler gamma. + # At each step size, lr will be multiplied by this parameter. +discriminator_grad_norm: 1 # Discriminator's gradient norm. + +########################################################### +# INTERVAL SETTING # +########################################################### +discriminator_train_start_steps: 100000 # Number of steps to start to train discriminator. +train_max_steps: 400000 # Number of training steps. +save_interval_steps: 5000 # Interval steps to save checkpoint. +eval_interval_steps: 1000 # Interval steps to evaluate the network. + + +########################################################### +# OTHER SETTING # +########################################################### +num_save_intermediate_results: 4 # Number of results to be saved as intermediate results. +num_snapshots: 10 # max number of snapshots to keep while training +seed: 42 # random seed for paddle, random, and np.random diff --git a/modules/audio/tts/fastspeech2_baker/module.py b/modules/audio/tts/fastspeech2_baker/module.py new file mode 100644 index 00000000..03d150c9 --- /dev/null +++ b/modules/audio/tts/fastspeech2_baker/module.py @@ -0,0 +1,125 @@ +# Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved. +# +# 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. + +import os +from pathlib import Path +from typing import List + +import numpy as np +import paddle +from paddlehub.env import MODULE_HOME +from paddlehub.module.module import moduleinfo, serving +from paddlehub.utils.log import logger +from parakeet.frontend.zh_frontend import Frontend +from parakeet.models.fastspeech2 import FastSpeech2 +from parakeet.models.fastspeech2 import FastSpeech2Inference +from parakeet.models.parallel_wavegan import PWGGenerator +from parakeet.models.parallel_wavegan import PWGInference +from parakeet.modules.normalizer import ZScore +import soundfile as sf +from yacs.config import CfgNode +import yaml + + +@moduleinfo(name="fastspeech2_baker", version="1.0.0", summary="", author="Baidu", author_email="", type="audio/tts") +class FastSpeech(paddle.nn.Layer): + def __init__(self, output_dir='./wavs'): + super(FastSpeech, self).__init__() + fastspeech2_res_dir = os.path.join(MODULE_HOME, 'fastspeech2_baker', 'assets/fastspeech2_nosil_baker_ckpt_0.4') + pwg_res_dir = os.path.join(MODULE_HOME, 'fastspeech2_baker', 'assets/pwg_baker_ckpt_0.4') + + phones_dict = os.path.join(fastspeech2_res_dir, 'phone_id_map.txt') + with open(phones_dict, "r") as f: + phn_id = [line.strip().split() for line in f.readlines()] + vocab_size = len(phn_id) + + # fastspeech2 + fastspeech2_config = os.path.join(fastspeech2_res_dir, 'default.yaml') + with open(fastspeech2_config) as f: + fastspeech2_config = CfgNode(yaml.safe_load(f)) + self.samplerate = fastspeech2_config.fs + + fastspeech2_checkpoint = os.path.join(fastspeech2_res_dir, 'snapshot_iter_76000.pdz') + model = FastSpeech2(idim=vocab_size, odim=fastspeech2_config.n_mels, **fastspeech2_config["model"]) + model.set_state_dict(paddle.load(fastspeech2_checkpoint)["main_params"]) + logger.info('Load fastspeech2 params from %s' % os.path.abspath(fastspeech2_checkpoint)) + model.eval() + + # vocoder + pwg_config = os.path.join(pwg_res_dir, 'pwg_default.yaml') + with open(pwg_config) as f: + pwg_config = CfgNode(yaml.safe_load(f)) + + pwg_checkpoint = os.path.join(pwg_res_dir, 'pwg_snapshot_iter_400000.pdz') + vocoder = PWGGenerator(**pwg_config["generator_params"]) + vocoder.set_state_dict(paddle.load(pwg_checkpoint)["generator_params"]) + logger.info('Load vocoder params from %s' % os.path.abspath(pwg_checkpoint)) + vocoder.remove_weight_norm() + vocoder.eval() + + # frontend + self.frontend = Frontend(phone_vocab_path=phones_dict) + + # stat + fastspeech2_stat = os.path.join(fastspeech2_res_dir, 'speech_stats.npy') + stat = np.load(fastspeech2_stat) + mu, std = stat + mu = paddle.to_tensor(mu) + std = paddle.to_tensor(std) + fastspeech2_normalizer = ZScore(mu, std) + + pwg_stat = os.path.join(pwg_res_dir, 'pwg_stats.npy') + stat = np.load(pwg_stat) + mu, std = stat + mu = paddle.to_tensor(mu) + std = paddle.to_tensor(std) + pwg_normalizer = ZScore(mu, std) + + # inference + self.fastspeech2_inference = FastSpeech2Inference(fastspeech2_normalizer, model) + self.pwg_inference = PWGInference(pwg_normalizer, vocoder) + + self.output_dir = Path(output_dir) + self.output_dir.mkdir(parents=True, exist_ok=True) + + def forward(self, text: str): + wav = None + input_ids = self.frontend.get_input_ids(text, merge_sentences=True) + phone_ids = input_ids["phone_ids"] + for part_phone_ids in phone_ids: + with paddle.no_grad(): + mel = self.fastspeech2_inference(part_phone_ids) + temp_wav = self.pwg_inference(mel) + if wav is None: + wav = temp_wav + else: + wav = paddle.concat([wav, temp_wav]) + + return wav + + @serving + def generate(self, sentences: List[str], device='cpu'): + assert isinstance(sentences, list) and isinstance(sentences[0], str), \ + 'Input data should be List[str], but got {}'.format(type(sentences)) + + paddle.set_device(device) + wav_files = [] + for i, sentence in enumerate(sentences): + wav = self(sentence) + wav_file = str(self.output_dir.absolute() / (str(i + 1) + ".wav")) + sf.write(wav_file, wav.numpy(), samplerate=self.samplerate) + wav_files.append(wav_file) + + logger.info('{} wave files have been generated in {}'.format(len(sentences), self.output_dir.absolute())) + return wav_files diff --git a/modules/audio/tts/fastspeech2_baker/requirements.txt b/modules/audio/tts/fastspeech2_baker/requirements.txt new file mode 100644 index 00000000..f410f4f4 --- /dev/null +++ b/modules/audio/tts/fastspeech2_baker/requirements.txt @@ -0,0 +1 @@ +git+https://github.com/PaddlePaddle/Parakeet@8040cb0#egg=paddle-parakeet diff --git a/modules/audio/tts/fastspeech2_ljspeech/README.md b/modules/audio/tts/fastspeech2_ljspeech/README.md new file mode 100644 index 00000000..54329460 --- /dev/null +++ b/modules/audio/tts/fastspeech2_ljspeech/README.md @@ -0,0 +1,156 @@ +# fastspeech2_ljspeech + +|模型名称|fastspeech2_ljspeech| +| :--- | :---: | +|类别|语音-语音合成| +|网络|FastSpeech2| +|数据集|LJSpeech-1.1| +|是否支持Fine-tuning|否| +|模型大小|425MB| +|最新更新日期|2021-10-20| +|数据指标|-| + +## 一、模型基本信息 + +### 模型介绍 + +FastSpeech2是微软亚洲研究院和微软Azure语音团队联合浙江大学于2020年提出的语音合成(Text to Speech, TTS)模型。FastSpeech2是FastSpeech的改进版,解决了FastSpeech依赖Teacher-Student的知识蒸馏框架,训练流程比较复杂和训练目标相比真实语音存在信息损失的问题。 + +FastSpeech2的模型架构如下图所示,它沿用FastSpeech中提出的Feed-Forward Transformer(FFT)架构,但在音素编码器和梅尔频谱解码器中加入了一个可变信息适配器(Variance Adaptor),从而支持在FastSpeech2中引入更多语音中变化的信息,例如时长、音高、音量(频谱能量)等,来解决语音合成中的一对多映射问题。 + +

+
+

+ +Parallel WaveGAN是一种使用了无蒸馏的对抗生成网络,快速且占用空间小的波形生成方法。该方法通过联合优化多分辨率谱图和对抗损失函数来训练非自回归WaveNet,可以有效捕获真实语音波形的时频分布。Parallel WaveGAN的结构如下图所示: + +

+
+

+ +fastspeech2_ljspeech使用了FastSpeech2作为声学模型,使用Parallel WaveGAN作为声码器,并在[The LJ Speech Dataset](https://keithito.com/LJ-Speech-Dataset/)数据集上进行了预训练,可直接用于预测合成音频。 + +更多详情请参考: +- [FastSpeech 2: Fast and High-Quality End-to-End Text-to-Speech](https://arxiv.org/abs/2006.04558) +- [FastSpeech语音合成系统技术升级,微软联合浙大提出FastSpeech2](https://www.msra.cn/zh-cn/news/features/fastspeech2) +- [Parallel WaveGAN: A fast waveform generation model based on generative adversarial networks with multi-resolution spectrogram](https://arxiv.org/abs/1910.11480) + +## 二、安装 + +- ### 1、环境依赖 + + - paddlepaddle >= 2.1.0 + + - paddlehub >= 2.1.0 | [如何安装PaddleHub](../../../../docs/docs_ch/get_start/installation.rst) + +- ### 2、安装 + + - ```shell + $ hub install fastspeech2_ljspeech + ``` + - 如您安装时遇到问题,可参考:[零基础windows安装](../../../../docs/docs_ch/get_start/windows_quickstart.md) + | [零基础Linux安装](../../../../docs/docs_ch/get_start/linux_quickstart.md) | [零基础MacOS安装](../../../../docs/docs_ch/get_start/mac_quickstart.md) + + +## 三、模型API预测 + +- ### 1、预测代码示例 + + ```python + import paddlehub as hub + + # 需要合成语音的文本 + sentences = ['The quick brown fox jumps over a lazy dog.'] + + model = hub.Module( + name='fastspeech2_ljspeech', + version='1.0.0') + wav_files = model.generate(sentences) + + # 打印合成的音频文件的路径 + print(wav_files) + ``` + + 详情可参考PaddleHub示例: + - [语音合成](../../../../demo/text_to_speech) + + +- ### 2、API + - ```python + def __init__(output_dir) + ``` + + - 创建Module对象(动态图组网版本) + + - **参数** + + - `output_dir`: 合成音频文件的输出目录。 + + - ```python + def generate( + sentences, + device='cpu', + ) + ``` + - 将输入的文本合成为音频文件并保存到输出目录。 + + - **参数** + + - `sentences`:合成音频的文本列表,类型为`List[str]`。 + - `device`:预测时使用的设备,默认为`cpu`,如需使用gpu预测,请设置为`gpu`。 + + - **返回** + + - `wav_files`:`List[str]`类型,返回合成音频的存放路径。 + + +## 四、服务部署 + +- PaddleHub Serving可以部署一个在线的语音识别服务。 + +- ### 第一步:启动PaddleHub Serving + + - ```shell + $ hub serving start -m fastspeech2_ljspeech + ``` + + - 这样就完成了一个语音识别服务化API的部署,默认端口号为8866。 + + - **NOTE:** 如使用GPU预测,则需要在启动服务之前,请设置CUDA_VISIBLE_DEVICES环境变量,否则不用设置。 + +- ### 第二步:发送预测请求 + + - 配置好服务端,以下数行代码即可实现发送预测请求,获取预测结果 + + - ```python + import requests + import json + + # 需要合成语音的文本 + sentences = [ + 'The quick brown fox jumps over a lazy dog.', + 'Today is a good day!', + ] + + # 以key的方式指定text传入预测方法的时的参数,此例中为"sentences" + data = {"sentences": sentences} + + # 发送post请求,content-type类型应指定json方式,url中的ip地址需改为对应机器的ip + url = "http://127.0.0.1:8866/predict/fastspeech2_ljspeech" + + # 指定post请求的headers为application/json方式 + headers = {"Content-Type": "application/json"} + + r = requests.post(url=url, headers=headers, data=json.dumps(data)) + print(r.json()) + ``` + +## 五、更新历史 + +* 1.0.0 + + 初始发布 + + ```shell + $ hub install fastspeech2_ljspeech + ``` diff --git a/modules/audio/tts/fastspeech2_ljspeech/__init__.py b/modules/audio/tts/fastspeech2_ljspeech/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/modules/audio/tts/fastspeech2_ljspeech/assets/fastspeech2_nosil_ljspeech_ckpt_0.5/default.yaml b/modules/audio/tts/fastspeech2_ljspeech/assets/fastspeech2_nosil_ljspeech_ckpt_0.5/default.yaml new file mode 100644 index 00000000..cabcca80 --- /dev/null +++ b/modules/audio/tts/fastspeech2_ljspeech/assets/fastspeech2_nosil_ljspeech_ckpt_0.5/default.yaml @@ -0,0 +1,104 @@ +########################################################### +# FEATURE EXTRACTION SETTING # +########################################################### + +fs: 22050 # sr +n_fft: 1024 # FFT size. +n_shift: 256 # Hop size. +win_length: null # Window length. + # If set to null, it will be the same as fft_size. +window: "hann" # Window function. + +# Only used for feats_type != raw + +fmin: 80 # Minimum frequency of Mel basis. +fmax: 7600 # Maximum frequency of Mel basis. +n_mels: 80 # The number of mel basis. + +# Only used for the model using pitch features (e.g. FastSpeech2) +f0min: 80 # Maximum f0 for pitch extraction. +f0max: 400 # Minimum f0 for pitch extraction. + + +########################################################### +# DATA SETTING # +########################################################### +batch_size: 64 +num_workers: 4 + + +########################################################### +# MODEL SETTING # +########################################################### +model: + adim: 384 # attention dimension + aheads: 2 # number of attention heads + elayers: 4 # number of encoder layers + eunits: 1536 # number of encoder ff units + dlayers: 4 # number of decoder layers + dunits: 1536 # number of decoder ff units + positionwise_layer_type: conv1d # type of position-wise layer + positionwise_conv_kernel_size: 3 # kernel size of position wise conv layer + duration_predictor_layers: 2 # number of layers of duration predictor + duration_predictor_chans: 256 # number of channels of duration predictor + duration_predictor_kernel_size: 3 # filter size of duration predictor + postnet_layers: 5 # number of layers of postnset + postnet_filts: 5 # filter size of conv layers in postnet + postnet_chans: 256 # number of channels of conv layers in postnet + use_masking: True # whether to apply masking for padded part in loss calculation + use_scaled_pos_enc: True # whether to use scaled positional encoding + encoder_normalize_before: True # whether to perform layer normalization before the input + decoder_normalize_before: True # whether to perform layer normalization before the input + reduction_factor: 1 # reduction factor + init_type: xavier_uniform # initialization type + init_enc_alpha: 1.0 # initial value of alpha of encoder scaled position encoding + init_dec_alpha: 1.0 # initial value of alpha of decoder scaled position encoding + transformer_enc_dropout_rate: 0.2 # dropout rate for transformer encoder layer + transformer_enc_positional_dropout_rate: 0.2 # dropout rate for transformer encoder positional encoding + transformer_enc_attn_dropout_rate: 0.2 # dropout rate for transformer encoder attention layer + transformer_dec_dropout_rate: 0.2 # dropout rate for transformer decoder layer + transformer_dec_positional_dropout_rate: 0.2 # dropout rate for transformer decoder positional encoding + transformer_dec_attn_dropout_rate: 0.2 # dropout rate for transformer decoder attention layer + pitch_predictor_layers: 5 # number of conv layers in pitch predictor + pitch_predictor_chans: 256 # number of channels of conv layers in pitch predictor + pitch_predictor_kernel_size: 5 # kernel size of conv leyers in pitch predictor + pitch_predictor_dropout: 0.5 # dropout rate in pitch predictor + pitch_embed_kernel_size: 1 # kernel size of conv embedding layer for pitch + pitch_embed_dropout: 0.0 # dropout rate after conv embedding layer for pitch + stop_gradient_from_pitch_predictor: true # whether to stop the gradient from pitch predictor to encoder + energy_predictor_layers: 2 # number of conv layers in energy predictor + energy_predictor_chans: 256 # number of channels of conv layers in energy predictor + energy_predictor_kernel_size: 3 # kernel size of conv leyers in energy predictor + energy_predictor_dropout: 0.5 # dropout rate in energy predictor + energy_embed_kernel_size: 1 # kernel size of conv embedding layer for energy + energy_embed_dropout: 0.0 # dropout rate after conv embedding layer for energy + stop_gradient_from_energy_predictor: false # whether to stop the gradient from energy predictor to encoder + + + +########################################################### +# UPDATER SETTING # +########################################################### +updater: + use_masking: True # whether to apply masking for padded part in loss calculation + + + +########################################################### +# OPTIMIZER SETTING # +########################################################### +optimizer: + optim: adam # optimizer type + learning_rate: 0.001 # learning rate + +########################################################### +# TRAINING SETTING # +########################################################### +max_epoch: 1000 +num_snapshots: 5 + + +########################################################### +# OTHER SETTING # +########################################################### +seed: 10086 diff --git a/modules/audio/tts/fastspeech2_ljspeech/assets/fastspeech2_nosil_ljspeech_ckpt_0.5/phone_id_map.txt b/modules/audio/tts/fastspeech2_ljspeech/assets/fastspeech2_nosil_ljspeech_ckpt_0.5/phone_id_map.txt new file mode 100644 index 00000000..c840e98e --- /dev/null +++ b/modules/audio/tts/fastspeech2_ljspeech/assets/fastspeech2_nosil_ljspeech_ckpt_0.5/phone_id_map.txt @@ -0,0 +1,80 @@ + 0 + 1 +AA0 2 +AA1 3 +AA2 4 +AE0 5 +AE1 6 +AE2 7 +AH0 8 +AH1 9 +AH2 10 +AO0 11 +AO1 12 +AO2 13 +AW0 14 +AW1 15 +AW2 16 +AY0 17 +AY1 18 +AY2 19 +B 20 +CH 21 +D 22 +DH 23 +EH0 24 +EH1 25 +EH2 26 +ER0 27 +ER1 28 +ER2 29 +EY0 30 +EY1 31 +EY2 32 +F 33 +G 34 +HH 35 +IH0 36 +IH1 37 +IH2 38 +IY0 39 +IY1 40 +IY2 41 +JH 42 +K 43 +L 44 +M 45 +N 46 +NG 47 +OW0 48 +OW1 49 +OW2 50 +OY0 51 +OY1 52 +OY2 53 +P 54 +R 55 +S 56 +SH 57 +T 58 +TH 59 +UH0 60 +UH1 61 +UH2 62 +UW0 63 +UW1 64 +UW2 65 +V 66 +W 67 +Y 68 +Z 69 +ZH 70 +sil 71 +sp 72 +spl 73 +spn 74 +, 75 +. 76 +? 77 +! 78 + 79 diff --git a/modules/audio/tts/fastspeech2_ljspeech/assets/pwg_ljspeech_ckpt_0.5/pwg_default.yaml b/modules/audio/tts/fastspeech2_ljspeech/assets/pwg_ljspeech_ckpt_0.5/pwg_default.yaml new file mode 100644 index 00000000..049ab93d --- /dev/null +++ b/modules/audio/tts/fastspeech2_ljspeech/assets/pwg_ljspeech_ckpt_0.5/pwg_default.yaml @@ -0,0 +1,119 @@ +# This is the hyperparameter configuration file for Parallel WaveGAN. +# Please make sure this is adjusted for the LJSpeech dataset. If you want to +# apply to the other dataset, you might need to carefully change some parameters. +# This configuration requires 12 GB GPU memory and takes ~3 days on TITAN V. + +########################################################### +# FEATURE EXTRACTION SETTING # +########################################################### +fs: 22050 # Sampling rate. +n_fft: 1024 # FFT size. (in samples) +n_shift: 256 # Hop size. (in samples) +win_length: null # Window length. (in samples) + # If set to null, it will be the same as fft_size. +window: "hann" # Window function. +n_mels: 80 # Number of mel basis. +fmin: 80 # Minimum freq in mel basis calculation. (Hz) +fmax: 7600 # Maximum frequency in mel basis calculation. (Hz) +trim_silence: false # Whether to trim the start and end of silence. +top_db: 60 # Need to tune carefully if the recording is not good. +trim_frame_length: 2048 # Frame size in trimming. (in samples) +trim_hop_length: 512 # Hop size in trimming. (in samples) + +########################################################### +# GENERATOR NETWORK ARCHITECTURE SETTING # +########################################################### +generator_params: + in_channels: 1 # Number of input channels. + out_channels: 1 # Number of output channels. + kernel_size: 3 # Kernel size of dilated convolution. + layers: 30 # Number of residual block layers. + stacks: 3 # Number of stacks i.e., dilation cycles. + residual_channels: 64 # Number of channels in residual conv. + gate_channels: 128 # Number of channels in gated conv. + skip_channels: 64 # Number of channels in skip conv. + aux_channels: 80 # Number of channels for auxiliary feature conv. + # Must be the same as num_mels. + aux_context_window: 2 # Context window size for auxiliary feature. + # If set to 2, previous 2 and future 2 frames will be considered. + dropout: 0.0 # Dropout rate. 0.0 means no dropout applied. + use_weight_norm: true # Whether to use weight norm. + # If set to true, it will be applied to all of the conv layers. + upsample_scales: [4, 4, 4, 4] # Upsampling scales. Prodcut of these must be the same as hop size. + +########################################################### +# DISCRIMINATOR NETWORK ARCHITECTURE SETTING # +########################################################### +discriminator_params: + in_channels: 1 # Number of input channels. + out_channels: 1 # Number of output channels. + kernel_size: 3 # Number of output channels. + layers: 10 # Number of conv layers. + conv_channels: 64 # Number of chnn layers. + bias: true # Whether to use bias parameter in conv. + use_weight_norm: true # Whether to use weight norm. + # If set to true, it will be applied to all of the conv layers. + nonlinear_activation: "LeakyReLU" # Nonlinear function after each conv. + nonlinear_activation_params: # Nonlinear function parameters + negative_slope: 0.2 # Alpha in LeakyReLU. + +########################################################### +# STFT LOSS SETTING # +########################################################### +stft_loss_params: + fft_sizes: [1024, 2048, 512] # List of FFT size for STFT-based loss. + hop_sizes: [120, 240, 50] # List of hop size for STFT-based loss + win_lengths: [600, 1200, 240] # List of window length for STFT-based loss. + window: "hann" # Window function for STFT-based loss + +########################################################### +# ADVERSARIAL LOSS SETTING # +########################################################### +lambda_adv: 4.0 # Loss balancing coefficient. + +########################################################### +# DATA LOADER SETTING # +########################################################### +batch_size: 8 # Batch size. +batch_max_steps: 25600 # Length of each audio in batch. Make sure dividable by hop_size. +pin_memory: true # Whether to pin memory in Pytorch DataLoader. +num_workers: 4 # Number of workers in Pytorch DataLoader. +remove_short_samples: true # Whether to remove samples the length of which are less than batch_max_steps. +allow_cache: true # Whether to allow cache in dataset. If true, it requires cpu memory. + +########################################################### +# OPTIMIZER & SCHEDULER SETTING # +########################################################### +generator_optimizer_params: + epsilon: 1.0e-6 # Generator's epsilon. + weight_decay: 0.0 # Generator's weight decay coefficient. +generator_scheduler_params: + learning_rate: 0.0001 # Generator's learning rate. + step_size: 200000 # Generator's scheduler step size. + gamma: 0.5 # Generator's scheduler gamma. + # At each step size, lr will be multiplied by this parameter. +generator_grad_norm: 10 # Generator's gradient norm. +discriminator_optimizer_params: + epsilon: 1.0e-6 # Discriminator's epsilon. + weight_decay: 0.0 # Discriminator's weight decay coefficient. +discriminator_scheduler_params: + learning_rate: 0.00005 # Discriminator's learning rate. + step_size: 200000 # Discriminator's scheduler step size. + gamma: 0.5 # Discriminator's scheduler gamma. + # At each step size, lr will be multiplied by this parameter. +discriminator_grad_norm: 1 # Discriminator's gradient norm. + +########################################################### +# INTERVAL SETTING # +########################################################### +discriminator_train_start_steps: 100000 # Number of steps to start to train discriminator. +train_max_steps: 400000 # Number of training steps. +save_interval_steps: 5000 # Interval steps to save checkpoint. +eval_interval_steps: 1000 # Interval steps to evaluate the network. + +########################################################### +# OTHER SETTING # +########################################################### +num_save_intermediate_results: 4 # Number of results to be saved as intermediate results. +num_snapshots: 10 # max number of snapshots to keep while training +seed: 42 # random seed for paddle, random, and np.random diff --git a/modules/audio/tts/fastspeech2_ljspeech/module.py b/modules/audio/tts/fastspeech2_ljspeech/module.py new file mode 100644 index 00000000..7281e181 --- /dev/null +++ b/modules/audio/tts/fastspeech2_ljspeech/module.py @@ -0,0 +1,130 @@ +# Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved. +# +# 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. + +import os +from pathlib import Path +from typing import List + +import numpy as np +import paddle +from paddlehub.env import MODULE_HOME +from paddlehub.module.module import moduleinfo, serving +from paddlehub.utils.log import logger +from parakeet.frontend import English +from parakeet.models.fastspeech2 import FastSpeech2 +from parakeet.models.fastspeech2 import FastSpeech2Inference +from parakeet.models.parallel_wavegan import PWGGenerator +from parakeet.models.parallel_wavegan import PWGInference +from parakeet.modules.normalizer import ZScore +import soundfile as sf +from yacs.config import CfgNode +import yaml + + +@moduleinfo(name="fastspeech2_ljspeech", version="1.0.0", summary="", author="Baidu", author_email="", type="audio/tts") +class FastSpeech(paddle.nn.Layer): + def __init__(self, output_dir='./wavs'): + super(FastSpeech, self).__init__() + fastspeech2_res_dir = os.path.join(MODULE_HOME, 'fastspeech2_ljspeech', + 'assets/fastspeech2_nosil_ljspeech_ckpt_0.5') + pwg_res_dir = os.path.join(MODULE_HOME, 'fastspeech2_ljspeech', 'assets/pwg_ljspeech_ckpt_0.5') + + phones_dict = os.path.join(fastspeech2_res_dir, 'phone_id_map.txt') + with open(phones_dict, "r") as f: + phn_id = [line.strip().split() for line in f.readlines()] + vocab_size = len(phn_id) + self.phone_id_map = {} + for phn, _id in phn_id: + self.phone_id_map[phn] = int(_id) + + # fastspeech2 + fastspeech2_config = os.path.join(fastspeech2_res_dir, 'default.yaml') + with open(fastspeech2_config) as f: + fastspeech2_config = CfgNode(yaml.safe_load(f)) + self.samplerate = fastspeech2_config.fs + + fastspeech2_checkpoint = os.path.join(fastspeech2_res_dir, 'snapshot_iter_100000.pdz') + model = FastSpeech2(idim=vocab_size, odim=fastspeech2_config.n_mels, **fastspeech2_config["model"]) + model.set_state_dict(paddle.load(fastspeech2_checkpoint)["main_params"]) + logger.info('Load fastspeech2 params from %s' % os.path.abspath(fastspeech2_checkpoint)) + model.eval() + + # vocoder + pwg_config = os.path.join(pwg_res_dir, 'pwg_default.yaml') + with open(pwg_config) as f: + pwg_config = CfgNode(yaml.safe_load(f)) + + pwg_checkpoint = os.path.join(pwg_res_dir, 'pwg_snapshot_iter_400000.pdz') + vocoder = PWGGenerator(**pwg_config["generator_params"]) + vocoder.set_state_dict(paddle.load(pwg_checkpoint)["generator_params"]) + logger.info('Load vocoder params from %s' % os.path.abspath(pwg_checkpoint)) + vocoder.remove_weight_norm() + vocoder.eval() + + # frontend + self.frontend = English() + self.punc = ":,;。?!“”‘’':,;.?!" + + # stat + fastspeech2_stat = os.path.join(fastspeech2_res_dir, 'speech_stats.npy') + stat = np.load(fastspeech2_stat) + mu, std = stat + mu = paddle.to_tensor(mu) + std = paddle.to_tensor(std) + fastspeech2_normalizer = ZScore(mu, std) + + pwg_stat = os.path.join(pwg_res_dir, 'pwg_stats.npy') + stat = np.load(pwg_stat) + mu, std = stat + mu = paddle.to_tensor(mu) + std = paddle.to_tensor(std) + pwg_normalizer = ZScore(mu, std) + + # inference + self.fastspeech2_inference = FastSpeech2Inference(fastspeech2_normalizer, model) + self.pwg_inference = PWGInference(pwg_normalizer, vocoder) + + self.output_dir = Path(output_dir) + self.output_dir.mkdir(parents=True, exist_ok=True) + + def forward(self, text: str): + phones = self.frontend.phoneticize(text) + # remove start_symbol and end_symbol + phones = phones[1:-1] + phones = [phn for phn in phones if not phn.isspace()] + phones = [phn if (phn in self.phone_id_map and phn not in self.punc) else "sp" for phn in phones] + phone_ids = [self.phone_id_map[phn] for phn in phones] + phone_ids = paddle.to_tensor(phone_ids) + + with paddle.no_grad(): + mel = self.fastspeech2_inference(phone_ids) + wav = self.pwg_inference(mel) + + return wav + + @serving + def generate(self, sentences: List[str], device='cpu'): + assert isinstance(sentences, list) and isinstance(sentences[0], str), \ + 'Input data should be List[str], but got {}'.format(type(sentences)) + + paddle.set_device(device) + wav_files = [] + for i, sentence in enumerate(sentences): + wav = self(sentence) + wav_file = str(self.output_dir.absolute() / (str(i + 1) + ".wav")) + sf.write(wav_file, wav.numpy(), samplerate=self.samplerate) + wav_files.append(wav_file) + + logger.info('{} wave files have been generated in {}'.format(len(sentences), self.output_dir.absolute())) + return wav_files diff --git a/modules/audio/tts/fastspeech2_ljspeech/requirements.txt b/modules/audio/tts/fastspeech2_ljspeech/requirements.txt new file mode 100644 index 00000000..f410f4f4 --- /dev/null +++ b/modules/audio/tts/fastspeech2_ljspeech/requirements.txt @@ -0,0 +1 @@ +git+https://github.com/PaddlePaddle/Parakeet@8040cb0#egg=paddle-parakeet -- GitLab