Showing preview only (6,034K chars total). Download the full file or copy to clipboard to get everything.
Repository: netease-youdao/EmotiVoice
Branch: main
Commit: bc2de8c9eb11
Files: 85
Total size: 5.7 MB
Directory structure:
gitextract_051xhzd2/
├── .dockerignore
├── .gitignore
├── Dockerfile
├── HTTP_API_TtsDemo/
│ ├── README.md
│ └── apidemo/
│ ├── TtsDemo.py
│ └── utils/
│ └── AuthV3Util.py
├── LICENSE
├── README.md
├── README.zh.md
├── README_小白安装教程.md
├── ROADMAP.md
├── cn2an/
│ ├── an2cn.py
│ └── conf.py
├── cog.yaml
├── config/
│ ├── joint/
│ │ ├── config.py
│ │ └── config.yaml
│ └── template.py
├── data/
│ ├── DataBaker/
│ │ ├── README.md
│ │ └── src/
│ │ ├── step0_download.sh
│ │ ├── step1_clean_raw_data.py
│ │ └── step2_get_phoneme.py
│ ├── LJspeech/
│ │ ├── README.md
│ │ └── src/
│ │ ├── step0_download.sh
│ │ ├── step1_clean_raw_data.py
│ │ └── step2_get_phoneme.py
│ ├── inference/
│ │ └── text
│ └── youdao/
│ └── text/
│ ├── README.md
│ ├── emotion
│ ├── energy
│ ├── pitch
│ ├── speaker2
│ ├── speed
│ └── tokenlist
├── demo_page.py
├── demo_page_databaker.py
├── frontend.py
├── frontend_cn.py
├── frontend_en.py
├── inference_am_vocoder_exp.py
├── inference_am_vocoder_joint.py
├── inference_tts.py
├── lexicon/
│ └── librispeech-lexicon.txt
├── mel_process.py
├── mfa/
│ ├── step1_create_dataset.py
│ ├── step2_prepare_data.py
│ ├── step3_prepare_special_tokens.py
│ ├── step4_convert_text_to_phn.py
│ ├── step5_prepare_alignment.py
│ ├── step7_gen_alignment_from_textgrid.py
│ ├── step8_make_data_list.py
│ └── step9_datalist_from_mfa.py
├── models/
│ ├── hifigan/
│ │ ├── dataset.py
│ │ ├── env.py
│ │ ├── get_random_segments.py
│ │ ├── get_vocoder.py
│ │ ├── models.py
│ │ └── pretrained_discriminator.py
│ └── prompt_tts_modified/
│ ├── audio_processing.py
│ ├── feats.py
│ ├── jets.py
│ ├── loss.py
│ ├── model_open_source.py
│ ├── modules/
│ │ ├── alignment.py
│ │ ├── encoder.py
│ │ ├── initialize.py
│ │ └── variance.py
│ ├── prompt_dataset.py
│ ├── scheduler.py
│ ├── simbert.py
│ ├── stft.py
│ ├── style_encoder.py
│ └── tacotron_stft.py
├── openaiapi.py
├── plot_image.py
├── predict.py
├── prepare_for_training.py
├── requirements.openaiapi.txt
├── requirements.txt
├── setup.py
├── text/
│ ├── __init__.py
│ ├── cleaners.py
│ ├── cmudict.py
│ ├── numbers.py
│ └── symbols.py
└── train_am_vocoder_joint.py
================================================
FILE CONTENTS
================================================
================================================
FILE: .dockerignore
================================================
# The .dockerignore file excludes files from the container build process.
#
# https://docs.docker.com/engine/reference/builder/#dockerignore-file
# Exclude Git files
.git
.github
.gitignore
# Exclude Python cache files
__pycache__
.mypy_cache
.pytest_cache
.ruff_cache
# Exclude Python virtual environment
/venv
================================================
FILE: .gitignore
================================================
outputs/
WangZeJun/
*.pyc
.vscode/
__pycache__/
.idea/
================================================
FILE: Dockerfile
================================================
# syntax=docker/dockerfile:1
FROM ubuntu:22.04
# install app dependencies
RUN apt-get update && apt-get install -y python3 python3-pip libsndfile1
RUN python3 -m pip install torch==1.11.0 torchaudio numpy numba scipy transformers==4.26.1 soundfile yacs
RUN python3 -m pip install pypinyin jieba
# install app
RUN mkdir /EmotiVoice
COPY . /EmotiVoice/
# final configuration
EXPOSE 8501
RUN python3 -m pip install streamlit g2p_en
WORKDIR /EmotiVoice
RUN python3 frontend_en.py
CMD streamlit run demo_page.py --server.port 8501
================================================
FILE: HTTP_API_TtsDemo/README.md
================================================
# 说明
项目为有道智云paas接口的python语言调用示例。您可以通过执行项目中的main函数快速调用有道智云相关api服务。
# 运行环境
1. python 3.6版本及以上。
# 运行方式
1. 在执行前您需要根据代码中的 <b>中文提示</b> 填写相关接口参数,具体参数取值可以访问 [智云官网](https://ai.youdao.com) 文档获取。
2. 同时您需要获取智云相关 <b>应用ID</b> 及 <b>应用密钥</b> 信息。具体获取方式可以访问 [入门指南](https://ai.youdao.com/doc.s#guide) 获取帮助。
# 注意事项
1. 项目中的代码有些仅作展示及参考,生产环境中请根据业务的实际情况进行修改。
2. 项目中接口返回的数据仅在控制台输出,实际使用中请根据实际情况进行解析。
================================================
FILE: HTTP_API_TtsDemo/apidemo/TtsDemo.py
================================================
import requests
from utils.AuthV3Util import addAuthParams
# 您的应用ID
APP_KEY = ''
# 您的应用密钥
APP_SECRET = ''
# 合成音频保存路径, 例windows路径:PATH = "C:\\tts\\media.mp3"
PATH = 'EmotiVoice-8051.mp3'
def createRequest():
'''
note: 将下列变量替换为需要请求的参数
'''
q = 'Emoti-Voice - a Multi-Voice and Prompt-Controlled T-T-S Engine,大家好'
voiceName = 'Maria Kasper' # 'Cori Samuel'
format = 'mp3'
data = {'q': q, 'voiceName': voiceName, 'format': format}
addAuthParams(APP_KEY, APP_SECRET, data)
header = {'Content-Type': 'application/x-www-form-urlencoded'}
res = doCall('https://openapi.youdao.com/ttsapi', header, data, 'post')
saveFile(res)
def doCall(url, header, params, method):
if 'get' == method:
return requests.get(url, params)
elif 'post' == method:
return requests.post(url, params, header)
def saveFile(res):
contentType = res.headers['Content-Type']
if 'audio' in contentType:
fo = open(PATH, 'wb')
fo.write(res.content)
fo.close()
print('save file path: ' + PATH)
else:
print(str(res.content, 'utf-8'))
# 网易有道智云语音合成服务api调用demo
# api接口: https://openapi.youdao.com/ttsapi
if __name__ == '__main__':
createRequest()
================================================
FILE: HTTP_API_TtsDemo/apidemo/utils/AuthV3Util.py
================================================
import hashlib
import time
import uuid
'''
添加鉴权相关参数 -
appKey : 应用ID
salt : 随机值
curtime : 当前时间戳(秒)
signType : 签名版本
sign : 请求签名
@param appKey 您的应用ID
@param appSecret 您的应用密钥
@param paramsMap 请求参数表
'''
def addAuthParams(appKey, appSecret, params):
q = params.get('q')
if q is None:
q = params.get('img')
salt = str(uuid.uuid1())
curtime = str(int(time.time()))
sign = calculateSign(appKey, appSecret, q, salt, curtime)
params['appKey'] = appKey
params['salt'] = salt
params['curtime'] = curtime
params['signType'] = 'v3'
params['sign'] = sign
'''
计算鉴权签名 -
计算方式 : sign = sha256(appKey + input(q) + salt + curtime + appSecret)
@param appKey 您的应用ID
@param appSecret 您的应用密钥
@param q 请求内容
@param salt 随机值
@param curtime 当前时间戳(秒)
@return 鉴权签名sign
'''
def calculateSign(appKey, appSecret, q, salt, curtime):
strSrc = appKey + getInput(q) + salt + curtime + appSecret
return encrypt(strSrc)
def encrypt(strSrc):
hash_algorithm = hashlib.sha256()
hash_algorithm.update(strSrc.encode('utf-8'))
return hash_algorithm.hexdigest()
def getInput(input):
if input is None:
return input
inputLen = len(input)
return input if inputLen <= 20 else input[0:10] + str(inputLen) + input[inputLen - 10:inputLen]
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2023, YOUDAO
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.
Legal Disclaimer and Notices
Further, the project may contain Third Party open source software (“OSS”) which include licenses under terms that require YOUDAO to display the following notice:
[Pytorch]
Pytorch is available under modified BSD license. You may find the source codes from https://github.com/pytorch/pytorch, and see the license at https://github.com/pytorch/pytorch/blob/main/LICENSE.
[ESPnet]
ESPnet is available under Apache 2.0 license. You may find the source codes from https://github.com/espnet/espnet, and see the license at https://github.com/espnet/espnet/blob/master/LICENSE.
[WeTTS]
WeTTS is available under Apache 2.0 license. You may find the source codes from https://github.com/wenet-e2e/wetts, and see the license at https://github.com/wenet-e2e/wetts/blob/main/LICENSE.
[HiFi-GAN]
HiFi-GAN is available under MIT license. You may find the source codes from https://github.com/jik876/hifi-gan, and see the license at https://github.com/jik876/hifi-gan/blob/master/LICENSE.
[Transformers]
Transformers is available under Apache 2.0 license. You may find the source codes from https://github.com/huggingface/transformers, and see the license at https://github.com/huggingface/transformers/blob/main/LICENSE.
[KAN-TTS]
KAN-TTS is available under MIT license. You may find the source codes from https://github.com/alibaba-damo-academy/KAN-TTS, and see the license at https://github.com/alibaba-damo-academy/KAN-TTS/blob/main/LICENSE.
[StyleTTS]
StyleTTS is available under MIT license. You may find the source codes from https://github.com/yl4579/StyleTTS, and see the license at https://github.com/yl4579/StyleTTS/blob/main/LICENSE.
[tacotron]
tacotron is available under MIT license. You may find the source codes from https://github.com/keithito/tacotron, and see the license at https://github.com/keithito/tacotron/blob/master/LICENSE.
[tacotron2]
tacotron2 is available under BSD 3-Clause license. You may find the source codes from https://github.com/NVIDIA/tacotron2, and see the license at https://github.com/NVIDIA/tacotron2/blob/master/LICENSE.
[torch-stft]
torch-stft is available under BSD 3-Clause license. You may find the source codes from https://github.com/pseeth/torch-stft, and see the license at https://github.com/pseeth/torch-stft/blob/master/LICENSE.
[LibriTTS]
LibriTTS is available under CC BY 4.0 license. You may find the data from https://www.openslr.org/60/, and see the license at https://www.openslr.org/60/.
[Hi-Fi TTS]
Hi-Fi TTS is available under CC BY 4.0 license. You may find the data from https://www.openslr.org/109/, and see the license at https://www.openslr.org/109/.
YOUDAO does not make any representation or warranty with respect to any OSS or free software that may be included in or accompany the Service. YOUDAO HEREBY DISCLAIMS ANY AND ALL LIABILITY TO DEMAND PARTNER OR ANY THIRD PARTY RELATED TO ANY SUCH SOFTWARE THAT MAY BE INCLUDED IN OR ACCOMPANY THE SERVICE.
================================================
FILE: README.md
================================================
<div align="center">
<a href="https://trendshift.io/repositories/4833" target="_blank"><img src="https://trendshift.io/api/badge/repositories/4833" alt="netease-youdao%2FEmotiVoice | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
<font size=4> README: EN | <a href="./README.zh.md">中文</a> </font>
<h1>EmotiVoice 😊: a Multi-Voice and Prompt-Controlled TTS Engine</h1>
</div>
<div align="center">
<a href="./README.zh.md"><img src="https://img.shields.io/badge/README-中文版本-red"></a>
<a href="./LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-yellow"></a>
<a href="https://twitter.com/YDopensource"><img src="https://img.shields.io/badge/follow-%40YDOpenSource-1DA1F2?logo=twitter&style={style}"></a>
</div>
<br>
**EmotiVoice** is a powerful and modern open-source text-to-speech engine that is available to you at no cost. EmotiVoice speaks both English and Chinese, and with over 2000 different voices (refer to the [List of Voices](https://github.com/netease-youdao/EmotiVoice/wiki/😊-voice-wiki-page) for details). The most prominent feature is **emotional synthesis**, allowing you to create speech with a wide range of emotions, including happy, excited, sad, angry and others.
An easy-to-use web interface is provided. There is also a scripting interface for batch generation of results.
Here are a few samples that EmotiVoice generates:
- [Chinese audio sample](https://github.com/netease-youdao/EmotiVoice/assets/3909232/6426d7c1-d620-4bfc-ba03-cd7fc046a4fb)
- [English audio sample](https://github.com/netease-youdao/EmotiVoice/assets/3909232/8f272eba-49db-493b-b479-2d9e5a419e26)
- [Fun Chinese English audio sample](https://github.com/netease-youdao/EmotiVoice/assets/3909232/a0709012-c3ef-4182-bb0e-b7a2ba386f1c)
## Demo
A demo is hosted on Replicate, [EmotiVoice](https://replicate.com/bramhooimeijer/emotivoice).
## Hot News
- [x] Tuning voice speed is now supported in 'OpenAI-compatible-TTS API', thanks to [@john9405](https://github.com/john9405). [#90](https://github.com/netease-youdao/EmotiVoice/pull/90) [#67](https://github.com/netease-youdao/EmotiVoice/issues/67) [#77](https://github.com/netease-youdao/EmotiVoice/issues/77)
- [x] [The EmotiVoice app for Mac](https://github.com/netease-youdao/EmotiVoice/releases/download/v0.3/emotivoice-1.0.0-arm64.dmg) was released on December 28th, 2023. Just download and taste EmotiVoice's offerings!
- [x] [The EmotiVoice HTTP API](https://github.com/netease-youdao/EmotiVoice/wiki/HTTP-API) was released on December 6th, 2023. Easier to start, faster to use, and with **over 13,000 free calls**. Additionally, users can explore more captivating voices provided by [Zhiyun](https://ai.youdao.com/).
- [x] [Voice Cloning with your personal data](https://github.com/netease-youdao/EmotiVoice/wiki/Voice-Cloning-with-your-personal-data) has been released on December 13th, 2023, along with [DataBaker Recipe](https://github.com/netease-youdao/EmotiVoice/tree/main/data/DataBaker) and [LJSpeech Recipe](https://github.com/netease-youdao/EmotiVoice/tree/main/data/LJspeech).
## Features under development
- [ ] Support for more languages, such as Japanese and Korean. [#19](https://github.com/netease-youdao/EmotiVoice/issues/19) [#22](https://github.com/netease-youdao/EmotiVoice/issues/22)
EmotiVoice prioritizes community input and user requests. We welcome your feedback!
## Quickstart
### EmotiVoice Docker image
The easiest way to try EmotiVoice is by running the docker image. You need a machine with a NVidia GPU. If you have not done so, set up NVidia container toolkit by following the instructions for [Linux](https://www.server-world.info/en/note?os=Ubuntu_22.04&p=nvidia&f=2) or [Windows WSL2](https://github.com/nyp-sit/it3103/blob/main/nvidia-docker-wsl2.md). Then EmotiVoice can be run with,
```sh
docker run -dp 127.0.0.1:8501:8501 syq163/emoti-voice:latest
```
The Docker image was updated on January 4th, 2024. If you have an older version, please update it by running the following commands:
```sh
docker pull syq163/emoti-voice:latest
docker run -dp 127.0.0.1:8501:8501 -p 127.0.0.1:8000:8000 syq163/emoti-voice:latest
```
Now open your browser and navigate to http://localhost:8501 to start using EmotiVoice's powerful TTS capabilities.
Starting from this version, the 'OpenAI-compatible-TTS API' is now accessible via http://localhost:8000/.
### Full installation
```sh
conda create -n EmotiVoice python=3.8 -y
conda activate EmotiVoice
pip install torch torchaudio
pip install numpy numba scipy transformers soundfile yacs g2p_en jieba pypinyin pypinyin_dict
python -m nltk.downloader "averaged_perceptron_tagger_eng"
```
### Prepare model files
We recommend that users refer to the wiki page [How to download the pretrained model files](https://github.com/netease-youdao/EmotiVoice/wiki/Pretrained-models) if they encounter any issues.
```sh
git lfs install
git lfs clone https://huggingface.co/WangZeJun/simbert-base-chinese WangZeJun/simbert-base-chinese
```
or, you can run:
```sh
git clone https://www.modelscope.cn/syq163/WangZeJun.git
```
### Inference
1. You can download the [pretrained models](https://drive.google.com/drive/folders/1y6Xwj_GG9ulsAonca_unSGbJ4lxbNymM?usp=sharing) by simply running the following command:
```sh
git clone https://www.modelscope.cn/syq163/outputs.git
```
2. The inference text format is `<speaker>|<style_prompt/emotion_prompt/content>|<phoneme>|<content>`.
- inference text example: `8051|Happy|<sos/eos> [IH0] [M] [AA1] [T] engsp4 [V] [OY1] [S] engsp4 [AH0] engsp1 [M] [AH1] [L] [T] [IY0] engsp4 [V] [OY1] [S] engsp1 [AE1] [N] [D] engsp1 [P] [R] [AA1] [M] [P] [T] engsp4 [K] [AH0] [N] [T] [R] [OW1] [L] [D] engsp1 [T] [IY1] engsp4 [T] [IY1] engsp4 [EH1] [S] engsp1 [EH1] [N] [JH] [AH0] [N] . <sos/eos>|Emoti-Voice - a Multi-Voice and Prompt-Controlled T-T-S Engine`.
4. You can get phonemes by `python frontend.py data/my_text.txt > data/my_text_for_tts.txt`.
5. Then run:
```sh
TEXT=data/inference/text
python inference_am_vocoder_joint.py \
--logdir prompt_tts_open_source_joint \
--config_folder config/joint \
--checkpoint g_00140000 \
--test_file $TEXT
```
the synthesized speech is under `outputs/prompt_tts_open_source_joint/test_audio`.
1. Or if you just want to use the interactive TTS demo page, run:
```sh
pip install streamlit
streamlit run demo_page.py
```
### OpenAI-compatible-TTS API
Thanks to @lewangdev for adding an OpenAI compatible API [#60](../../issues/60). To set it up, use the following command:
```sh
pip install fastapi pydub uvicorn[standard] pyrubberband
uvicorn openaiapi:app --reload
```
### Wiki page
You may find more information from our [wiki](https://github.com/netease-youdao/EmotiVoice/wiki) page.
## Training
[Voice Cloning with your personal data](https://github.com/netease-youdao/EmotiVoice/wiki/Voice-Cloning-with-your-personal-data) has been released on December 13th, 2023.
## Roadmap & Future work
- Our future plan can be found in the [ROADMAP](./ROADMAP.md) file.
- The current implementation focuses on emotion/style control by prompts. It uses only pitch, speed, energy, and emotion as style factors, and does not use gender. But it is not complicated to change it to style/timbre control.
- Suggestions are welcome. You can file issues or [@ydopensource](https://twitter.com/YDopensource) on twitter.
## WeChat group
Welcome to scan the QR code below and join the WeChat group.
<img src="https://github.com/netease-youdao/EmotiVoice/assets/49354974/cc3f4c8b-8369-4e50-89cc-e40d27a6bdeb" alt="qr" width="150"/>
## Credits
- [PromptTTS](https://speechresearch.github.io/prompttts/). The PromptTTS paper is a key basis of this project.
- [LibriTTS](https://www.openslr.org/60/). The LibriTTS dataset is used in training of EmotiVoice.
- [HiFiTTS](https://www.openslr.org/109/). The HiFi TTS dataset is used in training of EmotiVoice.
- [ESPnet](https://github.com/espnet/espnet).
- [WeTTS](https://github.com/wenet-e2e/wetts)
- [HiFi-GAN](https://github.com/jik876/hifi-gan)
- [Transformers](https://github.com/huggingface/transformers)
- [tacotron](https://github.com/keithito/tacotron)
- [KAN-TTS](https://github.com/alibaba-damo-academy/KAN-TTS)
- [StyleTTS](https://github.com/yl4579/StyleTTS)
- [Simbert](https://github.com/ZhuiyiTechnology/simbert)
- [cn2an](https://github.com/Ailln/cn2an). EmotiVoice incorporates cn2an for number processing.
## License
EmotiVoice is provided under the Apache-2.0 License - see the [LICENSE](./LICENSE) file for details.
The interactive page is provided under the [User Agreement](./EmotiVoice_UserAgreement_易魔声用户协议.pdf) file.
================================================
FILE: README.zh.md
================================================
<font size=4> README: <a href="./README.md">EN</a> | 中文 </font>
<div align="center">
<h1>EmotiVoice易魔声 😊: 多音色提示控制TTS</h1>
</div>
<div align="center">
<a href="./README.md"><img src="https://img.shields.io/badge/README-EN-red"></a>
<a href="./LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-yellow"></a>
<a href="https://twitter.com/YDopensource"><img src="https://img.shields.io/badge/follow-%40YDOpenSource-1DA1F2?logo=twitter&style={style}"></a>
</div>
<br>
**EmotiVoice**是一个强大的开源TTS引擎,**完全免费**,支持中英文双语,包含2000多种不同的音色,以及特色的**情感合成**功能,支持合成包含快乐、兴奋、悲伤、愤怒等广泛情感的语音。
EmotiVoice提供一个易于使用的web界面,还有用于批量生成结果的脚本接口。
以下是EmotiVoice生成的几个示例:
- [Chinese audio sample](https://github.com/netease-youdao/EmotiVoice/assets/3909232/6426d7c1-d620-4bfc-ba03-cd7fc046a4fb)
- [English audio sample](https://github.com/netease-youdao/EmotiVoice/assets/3909232/8f272eba-49db-493b-b479-2d9e5a419e26)
- [Fun Chinese English audio sample](https://github.com/netease-youdao/EmotiVoice/assets/3909232/a0709012-c3ef-4182-bb0e-b7a2ba386f1c)
## 热闻速递
- [x] 类OpenAI TTS的API已经支持调语速功能,感谢 [@john9405](https://github.com/john9405). [#90](https://github.com/netease-youdao/EmotiVoice/pull/90) [#67](https://github.com/netease-youdao/EmotiVoice/issues/67) [#77](https://github.com/netease-youdao/EmotiVoice/issues/77)
- [x] [Mac版一键安装包](https://github.com/netease-youdao/EmotiVoice/releases/download/v0.3/emotivoice-1.0.0-arm64.dmg) 已于2023年12月28日发布,**强烈推荐尽快下载使用,免费好用!**
- [x] [易魔声 HTTP API](https://github.com/netease-youdao/EmotiVoice/wiki/HTTP-API) 已于2023年12月6日发布上线。更易上手(无需任何安装配置),更快更稳定,单账户提供**超过 13,000 次免费调用**。此外,用户还可以使用[智云](https://ai.youdao.com/)提供的其它迷人的声音。
- [x] [用你自己的数据定制音色](https://github.com/netease-youdao/EmotiVoice/wiki/Voice-Cloning-with-your-personal-data)已于2023年12月13日发布上线,同时提供了两个教程示例:[DataBaker Recipe](https://github.com/netease-youdao/EmotiVoice/tree/main/data/DataBaker) [LJSpeech Recipe](https://github.com/netease-youdao/EmotiVoice/tree/main/data/LJspeech)。
## 开发中的特性
- [ ] 更多语言支持,例如日韩 [#19](https://github.com/netease-youdao/EmotiVoice/issues/19) [#22](https://github.com/netease-youdao/EmotiVoice/issues/22)
易魔声倾听社区需求并积极响应,期待您的反馈!
## 快速入门
### EmotiVoice Docker镜像
尝试EmotiVoice最简单的方法是运行docker镜像。你需要一台带有NVidia GPU的机器。先按照[Linux](https://www.server-world.info/en/note?os=Ubuntu_22.04&p=nvidia&f=2)和[Windows WSL2](https://zhuanlan.zhihu.com/p/653173679)平台的说明安装NVidia容器工具包。然后可以直接运行EmotiVoice镜像:
```sh
docker run -dp 127.0.0.1:8501:8501 syq163/emoti-voice:latest
```
Docker镜像更新于2024年1月4号。如果你使用了老的版本,推荐运行如下命令进行更新:
```sh
docker pull syq163/emoti-voice:latest
docker run -dp 127.0.0.1:8501:8501 -p 127.0.0.1:8000:8000 syq163/emoti-voice:latest
```
现在打开浏览器,导航到 http://localhost:8501 ,就可以体验EmotiVoice强大的TTS功能。从2024年的docker镜像版本开始,通过http://localhost:8000/可以使用类OpenAI TTS的API功能。
### 完整安装
```sh
conda create -n EmotiVoice python=3.8 -y
conda activate EmotiVoice
pip install torch torchaudio
pip install numpy numba scipy transformers soundfile yacs g2p_en jieba pypinyin pypinyin_dict
python -m nltk.downloader "averaged_perceptron_tagger_eng"
```
### 准备模型文件
强烈推荐用户参考[如何下载预训练模型文件](https://github.com/netease-youdao/EmotiVoice/wiki/Pretrained-models)的维基页面,尤其遇到问题时。
```sh
git lfs install
git lfs clone https://huggingface.co/WangZeJun/simbert-base-chinese WangZeJun/simbert-base-chinese
```
或者你可以运行:
```sh
git clone https://www.modelscope.cn/syq163/WangZeJun.git
```
### 推理
1. 通过简单运行如下命令来下载[预训练模型](https://drive.google.com/drive/folders/1y6Xwj_GG9ulsAonca_unSGbJ4lxbNymM?usp=sharing):
```sh
git clone https://www.modelscope.cn/syq163/outputs.git
```
2. 推理输入文本格式是:`<speaker>|<style_prompt/emotion_prompt/content>|<phoneme>|<content>`.
- 例如: `8051|非常开心|<sos/eos> uo3 sp1 l ai2 sp0 d ao4 sp1 b ei3 sp0 j ing1 sp3 q ing1 sp0 h ua2 sp0 d a4 sp0 x ve2 <sos/eos>|我来到北京,清华大学`.
4. 其中的音素(phonemes)可以这样得到:`python frontend.py data/my_text.txt > data/my_text_for_tts.txt`.
5. 然后运行:
```sh
TEXT=data/inference/text
python inference_am_vocoder_joint.py \
--logdir prompt_tts_open_source_joint \
--config_folder config/joint \
--checkpoint g_00140000 \
--test_file $TEXT
```
合成的语音结果在:`outputs/prompt_tts_open_source_joint/test_audio`.
6. 或者你可以直接使用交互的网页界面:
```sh
pip install streamlit
streamlit run demo_page.py
```
### 类OpenAI TTS的API
非常感谢 @lewangdev 的相关该工作 [#60](../../issues/60)。通过运行如下命令来完成配置:
```sh
pip install fastapi pydub uvicorn[standard] pyrubberband
uvicorn openaiapi:app --reload
```
### Wiki页面
如果遇到问题,或者想获取更多详情,请参考 [wiki](https://github.com/netease-youdao/EmotiVoice/wiki) 页面。
## 训练
[用你自己的数据定制音色](https://github.com/netease-youdao/EmotiVoice/wiki/Voice-Cloning-with-your-personal-data)已于2023年12月13日发布上线。
## 路线图和未来的工作
- 我们未来的计划可以在 [ROADMAP](./ROADMAP.md) 文件中找到。
- 当前的实现侧重于通过提示控制情绪/风格。它只使用音高、速度、能量和情感作为风格因素,而不使用性别。但是将其更改为样式、音色控制并不复杂,类似于PromptTTS的原始闭源实现。
## 微信群
欢迎扫描下方左侧二维码加入微信群。商业合作扫描右侧个人二维码。
<img src="https://github.com/netease-youdao/EmotiVoice/assets/49354974/cc3f4c8b-8369-4e50-89cc-e40d27a6bdeb" alt="qr" width="150"/>
<img src="https://github.com/netease-youdao/EmotiVoice/assets/3909232/94ee0824-0304-4487-8682-664fafd09cdf" alt="qr" width="150"/>
## 致谢
- [PromptTTS](https://speechresearch.github.io/prompttts/). PromptTTS论文是本工作的重要基础。
- [LibriTTS](https://www.openslr.org/60/). 训练使用了LibriTTS开放数据集。
- [HiFiTTS](https://www.openslr.org/109/). 训练使用了HiFi TTS开放数据集。
- [ESPnet](https://github.com/espnet/espnet).
- [WeTTS](https://github.com/wenet-e2e/wetts)
- [HiFi-GAN](https://github.com/jik876/hifi-gan)
- [Transformers](https://github.com/huggingface/transformers)
- [tacotron](https://github.com/keithito/tacotron)
- [KAN-TTS](https://github.com/alibaba-damo-academy/KAN-TTS)
- [StyleTTS](https://github.com/yl4579/StyleTTS)
- [Simbert](https://github.com/ZhuiyiTechnology/simbert)
- [cn2an](https://github.com/Ailln/cn2an). 易魔声集成了cn2an来处理数字。
## 许可
EmotiVoice是根据Apache-2.0许可证提供的 - 有关详细信息,请参阅[许可证文件](./LICENSE)。
交互的网页是根据[用户协议](./EmotiVoice_UserAgreement_易魔声用户协议.pdf)提供的。
================================================
FILE: README_小白安装教程.md
================================================
## 小白安装教程
#### 环境条件:设备有GPU、已经安装cuda
说明:这是针对Linux环境安装的教程,其他系统可作为参考。
#### 1、创建并进入conda环境
```
conda create -n EmotiVoice python=3.8
conda init
conda activate EmotiVoice
```
如果你不想使用conda环境,也可以省略该步骤,但要保证python版本为3.8
#### 2、安装git-lfs
如果是Ubuntu则执行
```
sudo apt update
sudo apt install git
sudo apt-get install git-lfs
```
CentOS则执行
```
sudo yum update
sudo yum install git
sudo yum install git-lfs
```
#### 3、克隆仓库
```
git lfs install
git lfs clone https://github.com/netease-youdao/EmotiVoice.git
```
#### 4、安装依赖
```
pip install torch torchaudio
pip install numpy numba scipy transformers soundfile yacs g2p_en jieba pypinyin pypinyin_dict
python -m nltk.downloader "averaged_perceptron_tagger_eng"
```
<a id="step5"></a>
#### 5、下载预训练模型文件
(1)首先进入项目文件夹
```
cd EmotiVoice
```
(2)执行下面命令
```
git lfs clone https://huggingface.co/WangZeJun/simbert-base-chinese WangZeJun/simbert-base-chinese
```
或者
```
git clone https://www.modelscope.cn/syq163/WangZeJun.git
```
上面两种下载方式二选一即可。
(3)第三步下载ckpt模型
```
git clone https://www.modelscope.cn/syq163/outputs.git
```
上面步骤完成后,项目文件夹内会多 `WangZeJun` 和 `outputs` 文件夹,下面是项目文件结构
```
├── Dockerfile
├── EmotiVoice_UserAgreement_易魔声用户协议.pdf
├── demo_page.py
├── frontend.py
├── frontend_cn.py
├── frontend_en.py
├── WangZeJun
│ └── simbert-base-chinese
│ ├── README.md
│ ├── config.json
│ ├── pytorch_model.bin
│ └── vocab.txt
├── outputs
│ ├── README.md
│ ├── configuration.json
│ ├── prompt_tts_open_source_joint
│ │ └── ckpt
│ │ ├── do_00140000
│ │ └── g_00140000
│ └── style_encoder
│ └── ckpt
│ └── checkpoint_163431
```
#### 6、运行UI交互界面
(1)安装streamlit
```
pip install streamlit
```
(2)启动
打开运行后显示的server地址,如何正常显示页面则部署完成。
```
streamlit run demo_page.py --server.port 6006 --logger.level debug
```
#### 7、启动API服务
安装依赖
```
pip install fastapi pydub uvicorn[standard] pyrubberband
```
在6006端口启动服务(端口可根据自己的需求修改)
```
uvicorn openaiapi:app --reload --port 6006
```
接口文档地址:你的服务地址+`/docs`
 
#### 8、遇到错误
**(1) 运行UI界面后,打开页面一直显示 "Please wait..." 或者显示一片空白**
原因:
这个错误可能是由于CORS(跨域资源共享)保护配置错误。
解决方法:
在启动时加上一个 `server.enableCORS=false` 参数,即使用下面命令启动程序
```
streamlit run demo_page.py --server.port 6006 --logger.level debug --server.enableCORS=false
```
如果通过临时禁用 CORS 保护解决了问题,建议重新启用 CORS 保护并设置正确的 URL 和端口。
 
**(2) 运行报错 raise BadZipFile("File is not a zip file") zipfile.BadZipFile: File is not a zip file**
原因:
这可能是由于缺少 `averaged_perceptron_tagger` 这个`nltk`中用于词性标注的一个包,它包含了一个基于平均感知器算法的词性标注器。如果你在代码中使用了这个标注器,但是没有预先下载对应的数据包,就会遇到错误,提示你缺少`averaged_perceptron_tagger.zip`文件。当然也有可能是缺少 `cmudict` CMU 发音词典数据包文件。
正常来说,初次运行程序NLTK会自动下载使用的相关数据包,debug模式下运行会显示如下信息
```
[nltk_data] Downloading package averaged_perceptron_tagger to
[nltk_data] /root/nltk_data...
[nltk_data] Unzipping taggers/averaged_perceptron_tagger.zip.
[nltk_data] Downloading package cmudict to /root/nltk_data...
[nltk_data] Unzipping corpora/cmudict.zip.
```
可能由于网络(需科学上网)等原因,没能自动下载成功,因此缺少相关文件导致加载报错。
解决方法:重新下载缺少的数据包文件
1)方法一
创建一个 download.py文件,在其中编写如下代码
```
import nltk
print(nltk.data.path)
nltk.download('averaged_perceptron_tagger')
nltk.download('cmudict')
```
保存并运行
```
python download.py
```
这将显示其文件索引位置,并自动下载 缺少的 `averaged_perceptron_tagger.zip`和 `cmudict.zip` 文件到/root/nltk_data目录下的子目录,下载完成后查看根目录下是否有`nltk_data`文件夹,并将其中的压缩包都解压。
 
2)方法二
如果通过上面代码还是无法正常下载数据包 ,也可以打开以下地址手动搜索并下载压缩包文件(需科学上网)
```
https://raw.githubusercontent.com/nltk/nltk_data/gh-pages/index.xml
```
其中下面是`averaged_perceptron_tagger.zip` 和`cmudict.zip` 数据包文件的下载地址
```
https://raw.githubusercontent.com/nltk/nltk_data/gh-pages/packages/taggers/averaged_perceptron_tagger.zip
https://raw.githubusercontent.com/nltk/nltk_data/gh-pages/packages/corpora/cmudict.zip
```
然后将该压缩包文件上传至(1)运行`python download.py`时打印显示的文件索引位置,如 `/root/nltk_data` 或者 `/root/miniconda3/envs/EmotiVoice/nltk_data` 等类似目录下,如果没有则创建一个,然后将zip压缩包解压。
 
解压后nltk_data目录结构应该是下面这样
```
├── nltk_data
│ ├── corpora
│ │ ├── cmudict
│ │ │ ├── README
│ │ │ └── cmudict
│ │ └── cmudict.zip
│ └── taggers
│ ├── averaged_perceptron_tagger
│ │ └── averaged_perceptron_tagger.pickle
│ └── averaged_perceptron_tagger.zip
```
 
**(3) 报错 AttributeError: 'NoneType' object has no attribute 'seek'.**
原因:未找到模型文件
解决方法:大概率是你未下载模型文件或者存放路径不正确,查看自己下载的模型文件是否存在,即outputs文件夹存放路径和里面的模型文件是否正确,正确结构可参考 [第五步](#step5) 中的项目结构。
 
**(4) 运行API服务出错 ImportError: cannot import name 'Doc' from 'typing_extensions'**
原因:typing_extensions 版本问题
解决方法:
尝试将`typing_extensions`升级至最新版本,如果已经是最新版本,则适当降低版本,以下版本在`fastapi V0.104.1`测试正常。
```
pip install typing_extensions==4.8.0 --force-reinstall
```
 
**(5) 请求文本转语音接口时报错 500 Internal Server Error ,FileNotFoundError: [Errno 2] No such file or directory: 'ffmpeg'**
原因:未安装ffmpeg
解决方法:
执行以下命令进行安装,如果是Ubuntu执行
```
sudo apt update
sudo apt install ffmpeg
```
CentOS则执行
```
sudo yum install epel-release
sudo yum install ffmpeg
```
安装完成后,你可以在终端中运行以下命令来验证"ffmpeg"是否成功安装:
```
ffmpeg -version
```
如果安装成功,你将看到"ffmpeg"的版本信息。
 
================================================
FILE: ROADMAP.md
================================================
# EmotiVoice Roadmap
This roadmap is for EmotiVoice (易魔声), a project driven by the community. We value your feedback and suggestions on our future direction.
Please visit https://github.com/netease-youdao/EmotiVoice/issues on GitHub to submit your proposals.
If you are interested, feel free to volunteer for any tasks, even if they are not listed.
The plan is to finish 0.2 to 0.4 in Q4 2023.
## EmotiVoice 0.4
- [ ] Updated model with potentially improved quality.
- [ ] First version of desktop application.
- [ ] Support longer text.
## EmotiVoice 0.3 (2023.12.13)
- [x] Release [The EmotiVoice HTTP API](https://github.com/netease-youdao/EmotiVoice/wiki/HTTP-API) provided by [Zhiyun](https://mp.weixin.qq.com/s/_Fbj4TI4ifC6N7NFOUrqKQ).
- [x] Release [Voice Cloning with your personal data](https://github.com/netease-youdao/EmotiVoice/wiki/Voice-Cloning-with-your-personal-data) along with [DataBaker Recipe](https://github.com/netease-youdao/EmotiVoice/tree/main/data/DataBaker) and [LJSpeech Recipe](https://github.com/netease-youdao/EmotiVoice/tree/main/data/LJspeech).
- [x] Documentation: wiki page for hardware requirements. [#30](../../issues/30)
## EmotiVoice 0.2 (2023.11.17)
- [x] Support mixed Chinese and English input text. [#28](../../issues/28)
- [x] Resolve bugs related to certain modal particles, to make it more robust. [#18](../../issues/18)
- [x] Documentation: voice list wiki page
- [x] Documentation: this roadmap.
## EmotiVoice 0.1 (2023.11.10) first public version
- [x] We offer a pretrained model with over 2000 voices, supporting both Chinese and English languages.
- [x] You can perform inference using the command line interface. We also offer a user-friendly web demo for easy usage.
- [x] For convenient deployment, we offer a Docker image.
================================================
FILE: cn2an/an2cn.py
================================================
"""
This code is modified from https://github.com/Ailln/cn2an.
"""
from typing import Union
from warnings import warn
#from proces import preprocess
from .conf import NUMBER_LOW_AN2CN, NUMBER_UP_AN2CN, UNIT_LOW_ORDER_AN2CN, UNIT_UP_ORDER_AN2CN
class An2Cn(object):
def __init__(self) -> None:
self.all_num = "0123456789"
self.number_low = NUMBER_LOW_AN2CN
self.number_up = NUMBER_UP_AN2CN
self.mode_list = ["low", "up", "rmb", "direct"]
def an2cn(self, inputs: Union[str, int, float] = None, mode: str = "low") -> str:
"""阿拉伯数字转中文数字
:param inputs: 阿拉伯数字
:param mode: low 小写数字,up 大写数字,rmb 人民币大写,direct 直接转化
:return: 中文数字
"""
if inputs is not None and inputs != "":
if mode not in self.mode_list:
raise ValueError(f"mode 仅支持 {str(self.mode_list)} !")
# 将数字转化为字符串,这里会有Python会自动做转化
# 1. -> 1.0 1.00 -> 1.0 -0 -> 0
if not isinstance(inputs, str):
inputs = self.__number_to_string(inputs)
# 数据预处理:
# 1. 繁体转简体
# 2. 全角转半角
#inputs = preprocess(inputs, pipelines=[
# "traditional_to_simplified",
# "full_angle_to_half_angle"
#])
# 检查数据是否有效
self.__check_inputs_is_valid(inputs)
# 判断正负
if inputs[0] == "-":
sign = "负"
inputs = inputs[1:]
else:
sign = ""
if mode == "direct":
output = self.__direct_convert(inputs)
else:
# 切割整数部分和小数部分
split_result = inputs.split(".")
len_split_result = len(split_result)
if len_split_result == 1:
# 不包含小数的输入
integer_data = split_result[0]
if mode == "rmb":
output = self.__integer_convert(integer_data, "up") + "元整"
else:
output = self.__integer_convert(integer_data, mode)
elif len_split_result == 2:
# 包含小数的输入
integer_data, decimal_data = split_result
if mode == "rmb":
int_data = self.__integer_convert(integer_data, "up")
dec_data = self.__decimal_convert(decimal_data, "up")
len_dec_data = len(dec_data)
if len_dec_data == 0:
output = int_data + "元整"
elif len_dec_data == 1:
raise ValueError(f"异常输出:{dec_data}")
elif len_dec_data == 2:
if dec_data[1] != "零":
if int_data == "零":
output = dec_data[1] + "角"
else:
output = int_data + "元" + dec_data[1] + "角"
else:
output = int_data + "元整"
else:
if dec_data[1] != "零":
if dec_data[2] != "零":
if int_data == "零":
output = dec_data[1] + "角" + dec_data[2] + "分"
else:
output = int_data + "元" + dec_data[1] + "角" + dec_data[2] + "分"
else:
if int_data == "零":
output = dec_data[1] + "角"
else:
output = int_data + "元" + dec_data[1] + "角"
else:
if dec_data[2] != "零":
if int_data == "零":
output = dec_data[2] + "分"
else:
output = int_data + "元" + "零" + dec_data[2] + "分"
else:
output = int_data + "元整"
else:
output = self.__integer_convert(integer_data, mode) + self.__decimal_convert(decimal_data, mode)
else:
raise ValueError(f"输入格式错误:{inputs}!")
else:
raise ValueError("输入数据为空!")
return sign + output
def __direct_convert(self, inputs: str) -> str:
_output = ""
for d in inputs:
if d == ".":
_output += "点"
else:
_output += self.number_low[int(d)]
return _output
@staticmethod
def __number_to_string(number_data: Union[int, float]) -> str:
# 小数处理:python 会自动把 0.00005 转化成 5e-05,因此 str(0.00005) != "0.00005"
string_data = str(number_data)
if "e" in string_data:
string_data_list = string_data.split("e")
string_key = string_data_list[0]
string_value = string_data_list[1]
if string_value[0] == "-":
string_data = "0." + "0" * (int(string_value[1:]) - 1) + string_key
else:
string_data = string_key + "0" * int(string_value)
return string_data
def __check_inputs_is_valid(self, check_data: str) -> None:
# 检查输入数据是否在规定的字典中
all_check_keys = self.all_num + ".-"
for data in check_data:
if data not in all_check_keys:
raise ValueError(f"输入的数据不在转化范围内:{data}!")
def __integer_convert(self, integer_data: str, mode: str) -> str:
if mode == "low":
numeral_list = NUMBER_LOW_AN2CN
unit_list = UNIT_LOW_ORDER_AN2CN
elif mode == "up":
numeral_list = NUMBER_UP_AN2CN
unit_list = UNIT_UP_ORDER_AN2CN
else:
raise ValueError(f"error mode: {mode}")
# 去除前面的 0,比如 007 => 7
integer_data = str(int(integer_data))
len_integer_data = len(integer_data)
if len_integer_data > len(unit_list):
raise ValueError(f"超出数据范围,最长支持 {len(unit_list)} 位")
output_an = ""
for i, d in enumerate(integer_data):
if int(d):
output_an += numeral_list[int(d)] + unit_list[len_integer_data - i - 1]
else:
if not (len_integer_data - i - 1) % 4:
output_an += numeral_list[int(d)] + unit_list[len_integer_data - i - 1]
if i > 0 and not output_an[-1] == "零":
output_an += numeral_list[int(d)]
output_an = output_an.replace("零零", "零").replace("零万", "万").replace("零亿", "亿").replace("亿万", "亿") \
.strip("零")
# 解决「一十几」问题
if output_an[:2] in ["一十"]:
output_an = output_an[1:]
# 0 - 1 之间的小数
if not output_an:
output_an = "零"
return output_an
def __decimal_convert(self, decimal_data: str, o_mode: str) -> str:
len_decimal_data = len(decimal_data)
if len_decimal_data > 16:
warn(f"注意:小数部分长度为 {len_decimal_data} ,将自动截取前 16 位有效精度!")
decimal_data = decimal_data[:16]
if len_decimal_data:
output_an = "点"
else:
output_an = ""
if o_mode == "low":
numeral_list = NUMBER_LOW_AN2CN
elif o_mode == "up":
numeral_list = NUMBER_UP_AN2CN
else:
raise ValueError(f"error mode: {o_mode}")
for data in decimal_data:
output_an += numeral_list[int(data)]
return output_an
================================================
FILE: cn2an/conf.py
================================================
"""
This code is modified from https://github.com/Ailln/cn2an.
"""
NUMBER_CN2AN = {
"零": 0,
"〇": 0,
"一": 1,
"壹": 1,
"幺": 1,
"二": 2,
"贰": 2,
"两": 2,
"三": 3,
"叁": 3,
"四": 4,
"肆": 4,
"五": 5,
"伍": 5,
"六": 6,
"陆": 6,
"七": 7,
"柒": 7,
"八": 8,
"捌": 8,
"九": 9,
"玖": 9,
}
UNIT_CN2AN = {
"十": 10,
"拾": 10,
"百": 100,
"佰": 100,
"千": 1000,
"仟": 1000,
"万": 10000,
"亿": 100000000,
}
UNIT_LOW_AN2CN = {
10: "十",
100: "百",
1000: "千",
10000: "万",
100000000: "亿",
}
NUMBER_LOW_AN2CN = {
0: "零",
1: "一",
2: "二",
3: "三",
4: "四",
5: "五",
6: "六",
7: "七",
8: "八",
9: "九",
}
NUMBER_UP_AN2CN = {
0: "零",
1: "壹",
2: "贰",
3: "叁",
4: "肆",
5: "伍",
6: "陆",
7: "柒",
8: "捌",
9: "玖",
}
UNIT_LOW_ORDER_AN2CN = [
"",
"十",
"百",
"千",
"万",
"十",
"百",
"千",
"亿",
"十",
"百",
"千",
"万",
"十",
"百",
"千",
]
UNIT_UP_ORDER_AN2CN = [
"",
"拾",
"佰",
"仟",
"万",
"拾",
"佰",
"仟",
"亿",
"拾",
"佰",
"仟",
"万",
"拾",
"佰",
"仟",
]
STRICT_CN_NUMBER = {
"零": "零",
"一": "一壹",
"二": "二贰",
"三": "三叁",
"四": "四肆",
"五": "五伍",
"六": "六陆",
"七": "七柒",
"八": "八捌",
"九": "九玖",
"十": "十拾",
"百": "百佰",
"千": "千仟",
"万": "万",
"亿": "亿",
}
NORMAL_CN_NUMBER = {
"零": "零〇",
"一": "一壹幺",
"二": "二贰两",
"三": "三叁仨",
"四": "四肆",
"五": "五伍",
"六": "六陆",
"七": "七柒",
"八": "八捌",
"九": "九玖",
"十": "十拾",
"百": "百佰",
"千": "千仟",
"万": "万",
"亿": "亿",
}
================================================
FILE: cog.yaml
================================================
# Configuration for Cog ⚙️
# Reference: https://github.com/replicate/cog/blob/main/docs/yaml.md
build:
gpu: true
# a list of ubuntu apt packages to install
# system_packages:
# - "libgl1-mesa-glx"
# - "libglib2.0-0"
python_version: "3.8"
python_packages:
- "torch==2.0.1"
- "torchaudio==2.0.2"
- "g2p-en==2.1.0"
- "jieba==0.42.1"
- "numba==0.58.1"
- "numpy==1.24.4"
- "pypinyin==0.49.0"
- "scipy==1.10.1"
- "soundfile==0.12.1"
- "transformers==4.26.1"
- "yacs==0.1.8"
run:
- curl -o /usr/local/bin/pget -L "https://github.com/replicate/pget/releases/download/v0.0.3/pget" && chmod +x /usr/local/bin/pget
# predict.py defines how predictions are run on your model
predict: "predict.py:Predictor"
================================================
FILE: config/joint/config.py
================================================
# Copyright 2023, YOUDAO
#
# 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
# with thanks to arjun-234 in https://github.com/netease-youdao/EmotiVoice/pull/38.
def get_labels_length(file_path):
"""
Return labels and their count in a file.
Args:
file_path (str): The path to the file containing the labels.
Returns:
list: labels; int: The number of labels in the file.
"""
with open(file_path, encoding = "UTF-8") as f:
tokens = [t.strip() for t in f.readlines()]
return tokens, len(tokens)
class Config:
#### PATH ####
ROOT_DIR = os.path.dirname(os.path.abspath("__file__"))
DATA_DIR = ROOT_DIR + "/data/youdao/"
train_data_path = DATA_DIR + "train_am/datalist.jsonl"
valid_data_path = DATA_DIR + "valid_am/datalist.jsonl"
output_directory = ROOT_DIR + "/outputs"
speaker2id_path = DATA_DIR + "text/speaker2"
emotion2id_path = DATA_DIR + "text/emotion"
pitch2id_path = DATA_DIR + "text/pitch"
energy2id_path = DATA_DIR + "text/energy"
speed2id_path = DATA_DIR + "text/speed"
bert_path = 'WangZeJun/simbert-base-chinese'
token_list_path = DATA_DIR + "text/tokenlist"
style_encoder_ckpt = ROOT_DIR + "/outputs/style_encoder/ckpt/checkpoint_163431"
tmp_dir = ROOT_DIR + "/tmp"
model_config_path = ROOT_DIR + "/config/joint/config.yaml"
#### Model ####
bert_hidden_size = 768
style_dim = 128
downsample_ratio = 1 # Whole Model
#### Text ####
tokens, n_symbols = get_labels_length(token_list_path)
sep = " "
#### Speaker ####
speakers, speaker_n_labels = get_labels_length(speaker2id_path)
#### Emotion ####
emotions, emotion_n_labels = get_labels_length(emotion2id_path)
#### Speed ####
speeds, speed_n_labels = get_labels_length(speed2id_path)
#### Pitch ####
pitchs, pitch_n_labels = get_labels_length(pitch2id_path)
#### Energy ####
energys, energy_n_labels = get_labels_length(energy2id_path)
#### Train ####
# epochs = 10
lr = 1e-3
lr_warmup_steps = 4000
kl_warmup_steps = 60_000
grad_clip_thresh = 1.0
batch_size = 16
train_steps = 10_000_000
opt_level = "O1"
seed = 1234
iters_per_validation= 1000
iters_per_checkpoint= 10000
#### Audio ####
sampling_rate = 16_000
max_db = 1
min_db = 0
trim = True
#### Stft ####
filter_length = 1024
hop_length = 256
win_length = 1024
window = "hann"
#### Mel ####
n_mel_channels = 80
mel_fmin = 0
mel_fmax = 8000
#### Pitch ####
pitch_min = 80
pitch_max = 400
pitch_stats = [225.089, 53.78]
#### Energy ####
energy_stats = [30.610, 21.78]
#### Infernce ####
gta = False
================================================
FILE: config/joint/config.yaml
================================================
###########################################################
# FEATURE EXTRACTION SETTING #
###########################################################
sr: 16000 # sr
n_fft: 1024 # FFT size (samples).
hop_length: 256 # Hop size (samples). 12.5ms
win_length: 1024 # Window length (samples). 50ms
# If set to null it will be the same as fft_size.
window: "hann" # Window function.
fmin: 0 # Minimum frequency of Mel basis.
fmax: null # Maximum frequency of Mel basis.
n_mels: 80 # The number of mel basis.
pitch_min: 80 # Minimum f0 in linear domain for pitch extraction.
pitch_max: 400 # Maximum f0 in linear domain for pitch extraction.
segment_size: 32
cut_sil: True
shuffle: True
pretrained_am: "" # absolute path
pretrained_vocoder: "" # absolute path
pretrained_discriminator: "" # absolute path
max_db: 1
min_db: 0
###########################################################
# MODEL SETTING #
###########################################################
model:
speaker_embed_dim: 384
bert_embedding: 768
#### encoder ####
lang_embed_dim: 0
encoder_n_layers: 4
encoder_n_heads: 8
encoder_n_hidden: 384
encoder_p_dropout: 0.2
encoder_kernel_size_conv_mod: 3
encoder_kernel_size_depthwise: 7
#### decoder ####
decoder_n_layers: 4
decoder_n_heads: 8
decoder_n_hidden: 384
decoder_p_dropout: 0.2
decoder_kernel_size_conv_mod: 3
decoder_kernel_size_depthwise: 31
#### prosodic ####
bottleneck_size_p: 4
bottleneck_size_u: 256
ref_enc_filters: [32, 32, 64, 64, 128, 128]
ref_enc_size: 3
ref_enc_strides: [1, 2, 1, 2, 1]
ref_enc_pad: [1, 1]
ref_enc_gru_size: 32
ref_attention_dropout: 0.2
token_num: 32
predictor_kernel_size: 5
stop_prosodic_gradient: False
ref_p_dropout: 0.1
ref_n_heads: 4
#### variance ####
variance_n_hidden: 384
variance_n_layers: 3
variance_kernel_size: 3
variance_p_dropout: 0.1
variance_embed_kernel_size: 9
variance_embde_p_dropout: 0.0
stop_pitch_gradient: False
stop_duration_gradient: False
duration_p_dropout: 0.5
duration_n_layers: 2
duration_kernel_size: 3
#### postnet ####
postnet_layers: 0
postnet_chans: 256
postnet_filts: 5
use_batch_norm: True
postnet_dropout_rate: 0.5
#### generator ####
resblock: "1"
upsample_rates: [8,8,2,2]
upsample_kernel_sizes: [16,16,4,4]
initial_channel: 80
upsample_initial_channel: 512
resblock_kernel_sizes: [3,7,11]
resblock_dilation_sizes: [[1,3,5], [1,3,5], [1,3,5]]
r: 1
###########################################################
# OPTIMIZER SETTING #
###########################################################
optimizer:
lr: 1.25e-5
betas: [0.5, 0.9]
eps: 1.0e-9
weight_decay: 0.0
scheduler:
gamma: 0.999875
================================================
FILE: config/template.py
================================================
# Copyright 2023, YOUDAO
#
# 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
# with thanks to arjun-234 in https://github.com/netease-youdao/EmotiVoice/pull/38.
def get_labels_length(file_path):
"""
Return labels and their count in a file.
Args:
file_path (str): The path to the file containing the labels.
Returns:
list: labels; int: The number of labels in the file.
"""
with open(file_path, encoding = "UTF-8") as f:
tokens = [t.strip() for t in f.readlines()]
return tokens, len(tokens)
class Config:
#### PATH ####
ROOT_DIR = os.path.dirname(os.path.abspath("__file__"))
DATA_DIR = ROOT_DIR + "/<DATA_DIR>"
# Change datalist.jsonl to datalist_mfa.jsonl if you have run MFA
train_data_path = DATA_DIR + "/train/datalist.jsonl"
valid_data_path = DATA_DIR + "/valid/datalist.jsonl"
output_directory = ROOT_DIR + "/<EXP_DIR>"
speaker2id_path = ROOT_DIR + "/<INFO_DIR>/speaker"
emotion2id_path = ROOT_DIR + "/<INFO_DIR>/emotion"
pitch2id_path = ROOT_DIR + "/<INFO_DIR>/pitch"
energy2id_path = ROOT_DIR + "/<INFO_DIR>/energy"
speed2id_path = ROOT_DIR + "/<INFO_DIR>/speed"
bert_path = 'WangZeJun/simbert-base-chinese'
token_list_path = ROOT_DIR + "/<INFO_DIR>/tokenlist"
style_encoder_ckpt = ROOT_DIR + "/outputs/style_encoder/ckpt/checkpoint_163431"
tmp_dir = output_directory + "/tmp"
model_config_path = ROOT_DIR + "/config/joint/config.yaml"
#### Model ####
bert_hidden_size = 768
style_dim = 128
downsample_ratio = 1 # Whole Model
#### Text ####
tokens, n_symbols = get_labels_length(token_list_path)
sep = " "
#### Speaker ####
speakers, speaker_n_labels = get_labels_length(speaker2id_path)
#### Emotion ####
emotions, emotion_n_labels = get_labels_length(emotion2id_path)
#### Speed ####
speeds, speed_n_labels = get_labels_length(speed2id_path)
#### Pitch ####
pitchs, pitch_n_labels = get_labels_length(pitch2id_path)
#### Energy ####
energys, energy_n_labels = get_labels_length(energy2id_path)
#### Train ####
# epochs = 10
lr = 1e-3
lr_warmup_steps = 4000
kl_warmup_steps = 60_000
grad_clip_thresh = 1.0
batch_size = 8
train_steps = 10_000_000
opt_level = "O1"
seed = 1234
iters_per_validation= 1000
iters_per_checkpoint= 5000
#### Audio ####
sampling_rate = 16_000
max_db = 1
min_db = 0
trim = True
#### Stft ####
filter_length = 1024
hop_length = 256
win_length = 1024
window = "hann"
#### Mel ####
n_mel_channels = 80
mel_fmin = 0
mel_fmax = 8000
#### Pitch ####
pitch_min = 80
pitch_max = 400
pitch_stats = [225.089, 53.78]
#### Energy ####
energy_stats = [30.610, 21.78]
#### Infernce ####
gta = False
================================================
FILE: data/DataBaker/README.md
================================================
# 😊 DataBaker Recipe
This is the recipe of Chinese single female speaker TTS model with DataBaker corpus.
## Guide For Finetuning
- [Environments Installation](#environments-installation)
- [Step0 Download Data](#step0-download-data)
- [Step1 Preprocess Data](#step1-preprocess-data)
- [Step2 Run MFA (Optional)](#step2-run-mfa-optional-since-we-already-have-labeled-prosody)
- [Step3 Prepare for training](#step3-prepare-for-training)
- [Step4 Start training](#step4-finetune-your-model)
- [Step5 Inference](#step5-inference)
### Environments Installation
create conda enviroment
```bash
conda create -n EmotiVoice python=3.8 -y
conda activate EmotiVoice
```
then run:
```bash
pip install EmotiVoice[train]
# or
git clone https://github.com/netease-youdao/EmotiVoice
pip install -e .[train]
```
Additionally, it is important to prepare the pre-trained models as mentioned in the [pretrained models](https://github.com/netease-youdao/EmotiVoice/wiki/Pretrained-models).
### Step0 Download Data
```bash
mkdir data/DataBaker/raw
# download
# please download the data from https://en.data-baker.com/datasets/freeDatasets/, and place the extracted BZNSYP folder under data/DataBaker/raw
```
### Step1 Preprocess Data
For this recipe, since DataBaker has already provided phoneme labels, we will simply utilize that information.
```bash
# format data
python data/DataBaker/src/step1_clean_raw_data.py \
--data_dir data/DataBaker
# get phoneme
python data/DataBaker/src/step2_get_phoneme.py \
--data_dir data/DataBaker
```
If you have prepared your own data with only text labels, you can obtain phonemes using the Text-to-Speech (TTS) frontend. For example, you can run the following command: `python data/DataBaker/src/step2_get_phoneme.py --data_dir data/DataBaker --generate_phoneme True`. However, please note that in this specific DataBaker's recipe, you should omit this command.
### Step2 Run MFA (Optional, since we already have labeled prosody)
Please be aware that in this particular DataBaker's recipe, **you should skip this step**. Nonetheless, if you have already prepared your own data with only text labels, the following commands might assist you:
```bash
# MFA environment install
conda install -c conda-forge kaldi sox librosa biopython praatio tqdm requests colorama pyyaml pynini openfst baumwelch ngram postgresql -y
pip install pgvector hdbscan montreal-forced-aligner
# MFA Step1
python mfa/step1_create_dataset.py \
--data_dir data/DataBaker
# MFA Step2
python mfa/step2_prepare_data.py \
--dataset_dir data/DataBaker/mfa \
--wav data/DataBaker/mfa/wav.txt \
--speaker data/DataBaker/mfa/speaker.txt \
--text data/DataBaker/mfa/text.txt
# MFA Step3
python mfa/step3_prepare_special_tokens.py \
--special_tokens data/DataBaker/mfa/special_token.txt
# MFA Step4
python mfa/step4_convert_text_to_phn.py \
--text data/DataBaker/mfa/text.txt \
--special_tokens data/DataBaker/mfa/special_token.txt \
--output data/DataBaker/mfa/text.txt
# MFA Step5
python mfa/step5_prepare_alignment.py \
--wav data/DataBaker/mfa/wav.txt \
--speaker data/DataBaker/mfa/speaker.txt \
--text data/DataBaker/mfa/text.txt \
--special_tokens data/DataBaker/mfa/special_token.txt \
--pronounciation_dict data/DataBaker/mfa/mfa_pronounciation_dict.txt \
--output_dir data/DataBaker/mfa/lab
# MFA Step6
mfa validate \
--overwrite \
--clean \
--single_speaker \
data/DataBaker/mfa/lab \
data/DataBaker/mfa/mfa_pronounciation_dict.txt
mfa train \
--overwrite \
--clean \
--single_speaker \
data/DataBaker/mfa/lab \
data/DataBaker/mfa/mfa_pronounciation_dict.txt \
data/DataBaker/mfa/mfa/mfa_model.zip \
data/DataBaker/mfa/TextGrid
mfa align \
--single_speaker \
data/DataBaker/mfa/lab \
data/DataBaker/mfa/mfa_pronounciation_dict.txt \
data/DataBaker/mfa/mfa/mfa_model.zip \
data/DataBaker/mfa/TextGrid
# MFA Step7
python mfa/step7_gen_alignment_from_textgrid.py \
--wav data/DataBaker/mfa/wav.txt \
--speaker data/DataBaker/mfa/speaker.txt \
--text data/DataBaker/mfa/text.txt \
--special_tokens data/DataBaker/mfa/special_token.txt \
--text_grid data/DataBaker/mfa/TextGrid \
--aligned_wav data/DataBaker/mfa/aligned_wav.txt \
--aligned_speaker data/DataBaker/mfa/aligned_speaker.txt \
--duration data/DataBaker/mfa/duration.txt \
--aligned_text data/DataBaker/mfa/aligned_text.txt \
--reassign_sp True
# MFA Step8
python mfa/step8_make_data_list.py \
--wav data/DataBaker/mfa/aligned_wav.txt \
--speaker data/DataBaker/mfa/aligned_speaker.txt \
--text data/DataBaker/mfa/aligned_text.txt \
--duration data/DataBaker/mfa/duration.txt \
--datalist_path data/DataBaker/mfa/datalist.jsonl
# MFA Step9
python mfa/step9_datalist_from_mfa.py \
--data_dir data/DataBaker
```
### Step3 Prepare for training
```bash
python prepare_for_training.py --data_dir data/DataBaker --exp_dir exp/DataBaker
```
__Please check and change the training and valid file path in the `exp/DataBaker/config/config.py`, especially:__
- `model_config_path`: corresponing model config file
- `DATA_DIR`: data dir
- `train_data_path` and `valid_data_path`: training file and valid file. Change to `datalist_mfa.jsonl` if you run Step2
- `batch_size`
### Step4 Finetune Your Model
```bash
torchrun \
--nproc_per_node=1 \
--master_port 8008 \
train_am_vocoder_joint.py \
--config_folder exp/DataBaker/config \
--load_pretrained_model True
```
Training tips:
- You can run tensorboad by
```
tensorboard --logdir=exp/DataBaker
```
- The model checkpoints are saved at `exp/DataBaker/ckpt`.
- The bert features are extracted in the first epoch and saved in `exp/DataBaker/tmp/` folder, you can change the path in `exp/DataBaker/config/config.py`.
### Step5 Inference
```bash
TEXT=data/inference/text
python inference_am_vocoder_exp.py \
--config_folder exp/DataBaker/config \
--checkpoint g_00010000 \
--test_file $TEXT
```
__Please change the speaker names in the `data/inference/text`__
the synthesized speech is under `exp/DataBaker/test_audio`.
================================================
FILE: data/DataBaker/src/step0_download.sh
================================================
# please download the data from https://en.data-baker.com/datasets/freeDatasets/, and place the extracted BZNSYP folder under data/DataBaker/raw
================================================
FILE: data/DataBaker/src/step1_clean_raw_data.py
================================================
"""
This code is modified from https://github.com/wenet-e2e/wetts.
"""
import os
import argparse
import soundfile as sf
import librosa
import jsonlines
from tqdm import tqdm
import re
def main(args):
ROOT_DIR=os.path.abspath(args.data_dir)
RAW_DIR=f"{ROOT_DIR}/raw"
WAV_DIR=f"{ROOT_DIR}/wavs"
TEXT_DIR=f"{ROOT_DIR}/text"
os.makedirs(WAV_DIR, exist_ok=True)
os.makedirs(TEXT_DIR, exist_ok=True)
with open(f"{RAW_DIR}/BZNSYP/ProsodyLabeling/000001-010000.txt", encoding="utf-8") as f, \
jsonlines.open(f"{TEXT_DIR}/data.jsonl", "w") as fout1:
lines = f.readlines()
for i in tqdm(range(0, len(lines), 2)):
key = lines[i][:6]
### Text
content_org = lines[i][7:].strip()
content = re.sub("[。,、“”?:……!( )—;]", "", content_org)
content_org = re.sub("#\d", "", content_org)
chars = []
prosody = {}
j = 0
while j < len(content):
if content[j] == "#":
prosody[len(chars) - 1] = content[j : j + 2]
j += 2
else:
chars.append(content[j])
j += 1
if key == "005107":
lines[i + 1] = lines[i + 1].replace(" ng1", " en1")
if key == "002365":
continue
syllable = lines[i + 1].strip().split()
s_index = 0
phones = []
phone = []
for k, char in enumerate(chars):
# 儿化音处理
er_flag = False
if char == "儿" and (s_index == len(syllable) or syllable[s_index][0:2] != "er"):
er_flag = True
else:
phones.append(syllable[s_index])
#phones.extend(lexicon[syllable[s_index]])
s_index += 1
if k in prosody:
if er_flag:
phones[-1] = prosody[k]
else:
phones.append(prosody[k])
else:
phones.append("#0")
### Wav
path = f"{RAW_DIR}/BZNSYP/Wave/{key}.wav"
wav_path = f"{WAV_DIR}/{key}.wav"
y, sr = sf.read(path)
y_16=librosa.resample(y, orig_sr=sr, target_sr=16_000)
sf.write(wav_path, y_16, 16_000)
fout1.write({
"key":key,
"wav_path":wav_path,
"speaker":"BZNSYP",
"text":["<sos/eos>"] + phones[:-1] + ["<sos/eos>"],
"original_text":content_org,
})
return
if __name__ == "__main__":
p = argparse.ArgumentParser()
p.add_argument('--data_dir', type=str, required=True)
args = p.parse_args()
main(args)
================================================
FILE: data/DataBaker/src/step2_get_phoneme.py
================================================
# Copyright 2023, YOUDAO
#
# 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 argparse
import os
import jsonlines
import json
from tqdm import tqdm
from multiprocessing.pool import ThreadPool
from functools import partial
import re
import sys
DIR=os.path.dirname(os.path.abspath("__file__"))
sys.path.append(DIR)
from frontend_cn import split_py, tn_chinese
from frontend_en import read_lexicon, G2p
from frontend import contains_chinese, re_digits, g2p_cn
# re_english_word = re.compile('([a-z\-\.\']+|\d+[\d\.]*)', re.I)
re_english_word = re.compile('([^\u4e00-\u9fa5]+|[ \u3002\uff0c\uff1f\uff01\uff1b\uff1a\u201c\u201d\u2018\u2019\u300a\u300b\u3008\u3009\u3010\u3011\u300e\u300f\u2014\u2026\u3001\uff08\uff09\u4e00-\u9fa5]+)', re.I)
def g2p_cn_en(text, g2p, lexicon):
# Our policy dictates that if the text contains Chinese, digits are to be converted into Chinese.
text=tn_chinese(text)
parts = re_english_word.split(text)
parts=list(filter(None, parts))
tts_text = ["<sos/eos>"]
chartype = ''
text_contains_chinese = contains_chinese(text)
for part in parts:
if part == ' ' or part == '': continue
if re_digits.match(part) and (text_contains_chinese or chartype == '') or contains_chinese(part):
if chartype == 'en':
tts_text.append('eng_cn_sp')
phoneme = g2p_cn(part).split()[1:-1]
chartype = 'cn'
elif re_english_word.match(part):
if chartype == 'cn':
if "sp" in tts_text[-1]:
""
else:
tts_text.append('cn_eng_sp')
phoneme = get_eng_phoneme(part, g2p, lexicon).split()
if not phoneme :
# tts_text.pop()
continue
else:
chartype = 'en'
else:
continue
tts_text.extend( phoneme )
tts_text=" ".join(tts_text).split()
if "sp" in tts_text[-1]:
tts_text.pop()
tts_text.append("<sos/eos>")
return " ".join(tts_text)
def get_eng_phoneme(text, g2p, lexicon):
"""
english g2p
"""
filters = {",", " ", "'"}
phones = []
words = list(filter(lambda x: x not in {"", " "}, re.split(r"([,;.\-\?\!\s+])", text)))
for w in words:
if w.lower() in lexicon:
for ph in lexicon[w.lower()]:
if ph not in filters:
phones += ["[" + ph + "]"]
if "sp" not in phones[-1]:
phones += ["engsp1"]
else:
phone=g2p(w)
if not phone:
continue
if phone[0].isalnum():
for ph in phone:
if ph not in filters:
phones += ["[" + ph + "]"]
if ph == " " and "sp" not in phones[-1]:
phones += ["engsp1"]
elif phone == " ":
continue
elif phones:
phones.pop() # pop engsp1
phones.append("engsp4")
if phones and "engsp" in phones[-1]:
phones.pop()
return " ".join(phones)
def onetime(resource, sample):
text=sample["text"]
# del sample["original_text"]
phoneme = get_phoneme(text, resource["g2p"]).split()
sample["text"]=phoneme
# sample["original_text"]=text
sample["prompt"]=sample["original_text"]
return sample
def onetime2(resource, sample):
text=sample["original_text"]
del sample["original_text"]
try:
phoneme = g2p_cn_en(text, resource["g2p_en"], resource["lexicon"]).split()#g2p_cn_eng_mix(text, resource["g2p_en"], resource["lexicon"]).split()
except:
print("Warning!!! phoneme get error! " + \
"Please check text")
print("Text is: ", text)
return ""
if not phoneme:
return ""
sample["text"]=phoneme
sample["original_text"]=text
sample["prompt"]=sample["original_text"]
return sample
def get_phoneme(text, g2p):
special_tokens = {"#0":"sp0", "#1":"sp1", "#2":"sp2", "#3":"sp3", "#4":"sp4", "<sos/eos>":"<sos/eos>"}
phones = []
for ph in text:
if ph not in special_tokens:
phs = g2p(ph)
phones.extend([ph for ph in phs if ph])
else:
phones.append(special_tokens[ph])
return " ".join(phones)
def main(args):
ROOT_DIR=args.data_dir
TRAIN_DIR=f"{ROOT_DIR}/train"
VALID_DIR=f"{ROOT_DIR}/valid"
TEXT_DIR=f"{ROOT_DIR}/text"
os.makedirs(TRAIN_DIR, exist_ok=True)
os.makedirs(VALID_DIR, exist_ok=True)
lexicon = read_lexicon(f"{DIR}/lexicon/librispeech-lexicon.txt")
g2p = G2p()
resource={
"g2p":split_py,
"g2p_en":g2p,
"lexicon":lexicon,
}
with jsonlines.open(f"{TEXT_DIR}/data.jsonl") as f:
data = list(f)
new_data=[]
with jsonlines.open(f"{TEXT_DIR}/datalist.jsonl", "w") as f:
for sample in tqdm(data):
if not args.generate_phoneme:
sample = onetime(resource, sample)
else:
sample = onetime2(resource, sample)
if not sample:
continue
f.write(sample)
new_data.append(sample)
with jsonlines.open(f"{TRAIN_DIR}/datalist.jsonl", "w") as f:
for sample in tqdm(new_data[:-3]):
f.write(sample)
with jsonlines.open(f"{VALID_DIR}/datalist.jsonl", "w") as f:
for sample in tqdm(data[-3:]):
f.write(sample)
return
if __name__ == "__main__":
p = argparse.ArgumentParser()
p.add_argument('--data_dir', type=str, required=True)
p.add_argument('--generate_phoneme', type=bool, default=False)
args = p.parse_args()
main(args)
================================================
FILE: data/LJspeech/README.md
================================================
# 😊 LJSpeech Recipe
This is the recipe of English single female speaker TTS model with LJSpeech corpus.
## Guide For Finetuning
- [Environments Installation](#environments-installation)
- [Step0 Download Data](#step0-download-data)
- [Step1 Preprocess Data](#step1-preprocess-data)
- [Step2 Run MFA (Optional, but Recommended)](#step2-run-mfa-optional-but-recommended)
- [Step3 Prepare for training](#step3-prepare-for-training)
- [Step4 Start training](#step4-finetune-your-model)
- [Step5 Inference](#step5-inference)
Run EmotiVoice Finetuning on Google Colab Notebook! [](https://colab.research.google.com/drive/1dDAyjoYGcDGwYpHI3Oj2_OIV-7DIdx2L?usp=sharing)
### Environments Installation
create conda enviroment
```bash
conda create -n EmotiVoice python=3.8 -y
conda activate EmotiVoice
```
then run:
```bash
pip install EmotiVoice[train]
# or
git clone https://github.com/netease-youdao/EmotiVoice
pip install -e .[train]
```
Additionally, it is important to prepare the pre-trained models as mentioned in the [pretrained models](https://github.com/netease-youdao/EmotiVoice/wiki/Pretrained-models).
### Step0 Download Data
```bash
mkdir data/LJspeech/raw
# download
wget -P data/LJspeech/raw http://data.keithito.com/data/speech/LJSpeech-1.1.tar.bz2
# extract
tar -xjf data/LJspeech/raw/LJSpeech-1.1.tar.bz2 -C data/LJspeech/raw
```
### Step1 Preprocess Data
```bash
# format data
python data/LJspeech/src/step1_clean_raw_data.py \
--data_dir data/LJspeech
# get phoneme
python data/LJspeech/src/step2_get_phoneme.py \
--data_dir data/LJspeech
```
### Step2 Run MFA (Optional, but Recommended!)
```bash
# MFA environment install
conda install -c conda-forge kaldi sox librosa biopython praatio tqdm requests colorama pyyaml pynini openfst baumwelch ngram postgresql -y
pip install pgvector hdbscan montreal-forced-aligner
# MFA Step1
python mfa/step1_create_dataset.py \
--data_dir data/LJspeech
# MFA Step2
python mfa/step2_prepare_data.py \
--dataset_dir data/LJspeech/mfa \
--wav data/LJspeech/mfa/wav.txt \
--speaker data/LJspeech/mfa/speaker.txt \
--text data/LJspeech/mfa/text.txt
# MFA Step3
python mfa/step3_prepare_special_tokens.py \
--special_tokens data/LJspeech/mfa/special_token.txt
# MFA Step4
python mfa/step4_convert_text_to_phn.py \
--text data/LJspeech/mfa/text.txt \
--special_tokens data/LJspeech/mfa/special_token.txt \
--output data/LJspeech/mfa/text.txt
# MFA Step5
python mfa/step5_prepare_alignment.py \
--wav data/LJspeech/mfa/wav.txt \
--speaker data/LJspeech/mfa/speaker.txt \
--text data/LJspeech/mfa/text.txt \
--special_tokens data/LJspeech/mfa/special_token.txt \
--pronounciation_dict data/LJspeech/mfa/mfa_pronounciation_dict.txt \
--output_dir data/LJspeech/mfa/lab
# MFA Step6
mfa validate \
--overwrite \
--clean \
--single_speaker \
data/LJspeech/mfa/lab \
data/LJspeech/mfa/mfa_pronounciation_dict.txt
mfa train \
--overwrite \
--clean \
--single_speaker \
data/LJspeech/mfa/lab \
data/LJspeech/mfa/mfa_pronounciation_dict.txt \
data/LJspeech/mfa/mfa/mfa_model.zip \
data/LJspeech/mfa/TextGrid
mfa align \
--single_speaker \
data/LJspeech/mfa/lab \
data/LJspeech/mfa/mfa_pronounciation_dict.txt \
data/LJspeech/mfa/mfa/mfa_model.zip \
data/LJspeech/mfa/TextGrid
# MFA Step7
python mfa/step7_gen_alignment_from_textgrid.py \
--wav data/LJspeech/mfa/wav.txt \
--speaker data/LJspeech/mfa/speaker.txt \
--text data/LJspeech/mfa/text.txt \
--special_tokens data/LJspeech/mfa/special_token.txt \
--text_grid data/LJspeech/mfa/TextGrid \
--aligned_wav data/LJspeech/mfa/aligned_wav.txt \
--aligned_speaker data/LJspeech/mfa/aligned_speaker.txt \
--duration data/LJspeech/mfa/duration.txt \
--aligned_text data/LJspeech/mfa/aligned_text.txt \
--reassign_sp True
# MFA Step8
python mfa/step8_make_data_list.py \
--wav data/LJspeech/mfa/aligned_wav.txt \
--speaker data/LJspeech/mfa/aligned_speaker.txt \
--text data/LJspeech/mfa/aligned_text.txt \
--duration data/LJspeech/mfa/duration.txt \
--datalist_path data/LJspeech/mfa/datalist.jsonl
# MFA Step9
python mfa/step9_datalist_from_mfa.py \
--data_dir data/LJspeech
```
### Step3 Prepare for training
```bash
python prepare_for_training.py --data_dir data/LJspeech --exp_dir exp/LJspeech
```
__Please check and change the training and valid file path in the `exp/LJspeech/config/config.py`, especially:__
- `model_config_path`: corresponing model config file
- `DATA_DIR`: data dir
- `train_data_path` and `valid_data_path`: training file and valid file. Change to `datalist_mfa.jsonl` if you run Step2
- `batch_size`
### Step4 Finetune Your Model
```bash
torchrun \
--nproc_per_node=1 \
--master_port 8008 \
train_am_vocoder_joint.py \
--config_folder exp/LJspeech/config \
--load_pretrained_model True
```
Training tips:
- You can run tensorboad by
```
tensorboard --logdir=exp/LJspeech
```
- The model checkpoints are saved at `exp/LJspeech/ckpt`.
- The bert features are extracted in the first epoch and saved in `exp/LJspeech/tmp/` folder, you can change the path in `exp/LJspeech/config/config.py`.
### Step5 Inference
```bash
TEXT=data/inference/text
python inference_am_vocoder_exp.py \
--config_folder exp/LJspeech/config \
--checkpoint g_00010000 \
--test_file $TEXT
```
__Please change the speaker name in the `data/inference/text`__
the synthesized speech is under `exp/LJspeech/test_audio`.
================================================
FILE: data/LJspeech/src/step0_download.sh
================================================
wget http://data.keithito.com/data/speech/LJSpeech-1.1.tar.bz2
tar -xjf LJSpeech-1.1.tar.bz2
================================================
FILE: data/LJspeech/src/step1_clean_raw_data.py
================================================
# Copyright 2023, YOUDAO
#
# 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
import argparse
import soundfile as sf
import librosa
import jsonlines
from tqdm import tqdm
def main(args):
ROOT_DIR=os.path.abspath(args.data_dir)
RAW_DIR=f"{ROOT_DIR}/raw"
WAV_DIR=f"{ROOT_DIR}/wavs"
TEXT_DIR=f"{ROOT_DIR}/text"
os.makedirs(WAV_DIR, exist_ok=True)
os.makedirs(TEXT_DIR, exist_ok=True)
with open(f"{RAW_DIR}/LJSpeech-1.1/metadata.csv") as f, \
jsonlines.open(f"{TEXT_DIR}/data.jsonl", "w") as fout1:
# open(f"{TEXT_DIR}/text_raw", "w") as fout2:
for line in tqdm(f):
#### Text ####
line = line.strip().split("|")
name = line[0]
text=line[1]
#### Wav #####
path = f"{RAW_DIR}/LJSpeech-1.1/wavs/{name}.wav"
wav_path = f"{WAV_DIR}/{name}.wav"
y, sr = sf.read(path)
y_16=librosa.resample(y, orig_sr=sr, target_sr=16_000)
sf.write(wav_path, y_16, 16_000)
#### Write ####
fout1.write({
"key":name,
"wav_path":wav_path,
"speaker":"LJ",
"original_text":text
})
# fout2.write(text+"\n")
return
if __name__ == "__main__":
p = argparse.ArgumentParser()
p.add_argument('--data_dir', type=str, required=True)
args = p.parse_args()
main(args)
================================================
FILE: data/LJspeech/src/step2_get_phoneme.py
================================================
# Copyright 2023, YOUDAO
#
# 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 argparse
import os
import jsonlines
import json
from tqdm import tqdm
from multiprocessing.pool import ThreadPool
from functools import partial
import re
import sys
DIR=os.path.dirname(os.path.abspath("__file__"))
sys.path.append(DIR)
from frontend_en import read_lexicon, G2p
def onetime(resource, sample):
text=sample["original_text"]
del sample["original_text"]
phoneme = get_phoneme(text, resource["g2p"], resource["lexicon"]).split()
sample["text"]=phoneme
sample["original_text"]=text
sample["prompt"]=text
return sample
def get_phoneme(text, g2p, lexicon):
filters = {",", " ", "'"}
phones = []
words = list(filter(lambda x: x not in {"", " "}, re.split(r"([,;.\-\?\!\s+])", text)))
for w in words:
if w.lower() in lexicon:
for ph in lexicon[w.lower()]:
if ph not in filters:
phones += ["[" + ph + "]"]
if "sp" not in phones[-1]:
phones += ["engsp1"]
else:
phone=g2p(w)
if not phone:
continue
if phone[0].isalnum():
for ph in phone:
if ph not in filters:
phones += ["[" + ph + "]"]
if ph == " " and "sp" not in phones[-1]:
phones += ["engsp1"]
elif phone == " ":
continue
elif phones:
phones.pop() # pop engsp1
phones.append("engsp4")
if phones and "engsp" in phones[-1]:
phones.pop()
mark = "." if text[-1] != "?" else "?"
phones = ["<sos/eos>"] + phones + [mark, "<sos/eos>"]
return " ".join(phones)
def main(args):
ROOT_DIR=args.data_dir
TRAIN_DIR=f"{ROOT_DIR}/train"
VALID_DIR=f"{ROOT_DIR}/valid"
TEXT_DIR=f"{ROOT_DIR}/text"
os.makedirs(TRAIN_DIR, exist_ok=True)
os.makedirs(VALID_DIR, exist_ok=True)
lexicon = read_lexicon(f"{DIR}/lexicon/librispeech-lexicon.txt")
g2p = G2p()
resource={
"g2p":g2p,
"lexicon":lexicon,
}
with jsonlines.open(f"{TEXT_DIR}/data.jsonl") as f:
data = list(f)
new_data=[]
with jsonlines.open(f"{TEXT_DIR}/datalist.jsonl", "w") as f:
for sample in tqdm(data):
sample = onetime(resource, sample)
f.write(sample)
new_data.append(sample)
with jsonlines.open(f"{TRAIN_DIR}/datalist.jsonl", "w") as f:
for sample in tqdm(new_data[:-3]):
f.write(sample)
with jsonlines.open(f"{VALID_DIR}/datalist.jsonl", "w") as f:
for sample in tqdm(data[-3:]):
f.write(sample)
return
if __name__ == "__main__":
p = argparse.ArgumentParser()
p.add_argument('--data_dir', type=str, required=True)
args = p.parse_args()
main(args)
================================================
FILE: data/inference/text
================================================
8051|Happy|<sos/eos> [IH0] [M] [AA1] [T] engsp4 [V] [OY1] [S] engsp4 [AH0] engsp1 [M] [AH1] [L] [T] [IY0] engsp4 [V] [OY1] [S] engsp1 [AE1] [N] [D] engsp1 [P] [R] [AA1] [M] [P] [T] engsp4 [K] [AH0] [N] [T] [R] [OW1] [L] [D] engsp1 [T] [IY1] engsp4 [T] [IY1] engsp4 [EH1] [S] engsp1 [EH1] [N] [JH] [AH0] [N] . <sos/eos>|Emoti-Voice - a Multi-Voice and Prompt-Controlled T-T-S Engine
8051|哭唧唧|<sos/eos> uo3 sp1 l ai2 sp0 d ao4 sp1 b ei3 sp0 j ing1 sp3 q ing1 sp0 h ua2 sp0 d a4 sp0 x ve2 <sos/eos>|我来到北京,清华大学
11614|第一章|<sos/eos> d i4 sp0 i1 sp0 zh ang1 <sos/eos>|第一章
9017|在昏暗狭小的房间内,我父亲躺在窗前的地板上,全身素白,显得身子特别长。|<sos/eos> z ai4 sp1 h uen1 sp0 an4 sp1 x ia2 sp0 x iao3 sp0 d e5 sp1 f ang2 sp0 j ian1 sp0 n ei4 sp3 uo3 sp1 f u4 sp0 q in1 sp1 t ang3 sp0 z ai4 sp1 ch uang1 sp0 q ian2 sp0 d e5 sp1 d i4 sp0 b an3 sp0 sh ang4 sp3 q van2 sp0 sh en1 sp1 s u4 sp0 b ai2 sp3 x ian3 sp0 d e5 sp1 sh en1 sp0 z ii5 sp1 t e4 sp0 b ie2 sp0 ch ang2 <sos/eos>|在昏暗狭小的房间内,我父亲躺在窗前的地板上,全身素白,显得身子特别长。
6097|他光着双脚,脚趾头怪模怪样地向外翻着,一双亲切的手平静地放在胸前,手指头也是弯曲的。|<sos/eos> t a1 sp1 g uang1 sp0 zh e5 sp1 sh uang1 sp0 j iao3 sp3 j iao2 sp0 zh iii3 sp0 t ou5 sp1 g uai4 sp0 m u2 sp1 g uai4 sp0 iang4 sp0 d e5 sp1 x iang4 sp0 uai4 sp1 f an1 sp0 zh e5 sp3 i4 sp0 sh uang1 sp1 q in1 sp0 q ie4 sp0 d e5 sp0 sh ou3 sp2 p ing2 sp0 j ing4 sp0 d e5 sp1 f ang4 sp0 z ai4 sp1 x iong1 sp0 q ian2 sp3 sh ou2 sp0 zh iii3 sp0 t ou5 sp1 ie3 sp0 sh iii4 sp1 uan1 sp0 q v1 sp0 d e5 <sos/eos>|他光着双脚,脚趾头怪模怪样地向外翻着,一双亲切的手平静地放在胸前,手指头也是弯曲的。
6671|他双目紧闭,可以看见铜钱在上面留下的黑色圆圈;和善的面孔乌青发黑,龇牙咧嘴,挺吓人的。|<sos/eos> t a1 sp1 sh uang1 sp0 m u4 sp1 j in3 sp0 b i4 sp3 k e2 sp0 i3 sp1 k an4 sp0 j ian4 sp1 t ong2 sp0 q ian2 sp1 z ai4 sp0 sh ang4 sp0 m ian4 sp1 l iou2 sp0 x ia4 sp0 d e5 sp1 h ei1 sp0 s e4 sp1 van2 sp0 q van1 sp3 h e2 sp0 sh an4 sp0 d e5 sp1 m ian4 sp0 k ong3 sp2 u1 sp0 q ing1 sp1 f a1 sp0 h ei1 sp3 z ii1 sp0 ia2 sp0 l ie2 sp0 z uei3 sp3 t ing3 sp1 x ia4 sp0 r en2 sp0 d e5 <sos/eos>|他双目紧闭,可以看见铜钱在上面留下的黑色圆圈;和善的面孔乌青发黑,龇牙咧嘴,挺吓人的。
6670|母亲半光着上身,穿一条红裙子,跪在地上,正在用那把我常用来锯西瓜皮的小黑梳子,将父亲那又长又软的头发从前额向脑后梳去。|<sos/eos> m u3 sp0 q in1 sp2 b an4 sp0 g uang1 sp0 zh e5 sp1 sh ang4 sp0 sh en1 sp3 ch uan1 sp0 i4 sp0 t iao2 sp1 h ong2 sp0 q vn2 sp0 z ii5 sp3 g uei4 sp0 z ai4 sp1 d i4 sp0 sh ang5 sp3 zh eng4 sp0 z ai4 sp1 iong4 sp0 n a4 sp1 b a2 sp0 uo3 sp1 ch ang2 sp0 iong4 sp0 l ai2 sp1 j v4 sp1 x i1 sp0 g ua1 sp0 p i2 sp0 d e5 sp1 x iao3 sp0 h ei1 sp1 sh u1 sp0 z ii5 sp3 j iang1 sp1 f u4 sp0 q in1 sp1 n a4 sp1 iou4 sp0 ch ang2 sp1 iou4 sp0 r uan3 sp0 d e5 sp1 t ou2 sp0 f a4 sp3 c ong2 sp1 q ian2 sp0 e2 sp1 x iang4 sp1 n ao3 sp0 h ou4 sp1 sh u1 sp0 q v4 <sos/eos>|母亲半光着上身,穿一条红裙子,跪在地上,正在用那把我常用来锯西瓜皮的小黑梳子,将父亲那又长又软的头发从前额向脑后梳去。
9136|母亲一直在诉说着什么,声音嘶哑而低沉,她那双浅灰色的眼睛已经浮肿,仿佛融化了似的,眼泪大滴大滴地直往下落。|<sos/eos> m u3 sp0 q in1 sp1 i4 sp0 zh iii2 sp1 z ai4 sp1 s u4 sp0 sh uo1 sp0 zh e5 sp1 sh en2 sp0 m e5 sp3 sh eng1 sp0 in1 sp1 s ii1 sp0 ia3 sp1 er2 sp1 d i1 sp0 ch en2 sp3 t a1 sp1 n a4 sp0 sh uang1 sp1 q ian3 sp0 h uei1 sp0 s e4 sp0 d e5 sp1 ian3 sp0 j ing5 sp2 i3 sp0 j ing1 sp1 f u2 sp0 zh ong3 sp3 f ang3 sp0 f u2 sp1 r ong2 sp0 h ua4 sp0 l e5 sp1 sh iii4 sp0 d e5 sp3 ian3 sp0 l ei4 sp1 d a4 sp0 d i1 sp1 d a4 sp0 d i1 sp0 d e5 sp1 zh iii2 sp0 uang3 sp0 x ia4 sp0 l uo4 <sos/eos>|母亲一直在诉说着什么,声音嘶哑而低沉,她那双浅灰色的眼睛已经浮肿,仿佛融化了似的,眼泪大滴大滴地直往下落。
11697|外婆拽着我的手;她长得圆滚滚的,大脑袋、大眼睛和一只滑稽可笑的松弛的鼻子。|<sos/eos> uai4 sp0 p o2 sp1 zh uai4 sp0 zh e5 sp1 uo3 sp0 d e5 sp0 sh ou3 sp3 t a1 sp1 zh ang3 sp0 d e5 sp1 van2 sp0 g uen2 sp0 g uen3 sp0 d e5 sp3 d a4 sp0 n ao3 sp0 d ai5 sp3 d a4 sp0 ian3 sp0 j ing5 sp3 h e2 sp1 i4 sp0 zh iii1 sp1 h ua2 sp0 j i1 sp1 k e3 sp0 x iao4 sp0 d e5 sp1 s ong1 sp0 ch iii2 sp0 d e5 sp1 b i2 sp0 z ii5 <sos/eos>|外婆拽着我的手;她长得圆滚滚的,大脑袋、大眼睛和一只滑稽可笑的松弛的鼻子。
92|她穿一身黑衣服,身上软乎乎的,特别好玩。她也在哭,但哭得有些特别,和母亲的哭声交相呼应。她全身都在颤抖,而且老是把我往父亲跟前推。我扭动身子,直往她身后躲;我感到害怕,浑身不自在。|<sos/eos> t a1 sp0 ch uan1 sp1 i4 sp0 sh en1 sp1 h ei1 sp0 i1 sp0 f u2 sp3 sh en1 sp0 sh ang4 sp1 r uan3 sp0 h u1 sp0 h u1 sp0 d e5 sp3 t e4 sp0 b ie2 sp1 h ao3 sp0 uan2 sp3 t a1 sp0 ie3 sp1 z ai4 sp0 k u1 sp3 d an4 sp1 k u1 sp0 d e5 sp1 iou3 sp0 x ie1 sp1 t e4 sp0 b ie2 sp3 h e2 sp1 m u3 sp0 q in1 sp0 d e5 sp1 k u1 sp0 sh eng1 sp1 j iao1 sp0 x iang1 sp1 h u1 sp0 ing4 sp3 t a1 sp1 q van2 sp0 sh en1 sp1 d ou1 sp0 z ai4 sp1 ch an4 sp0 d ou3 sp3 er2 sp0 q ie3 sp1 l ao3 sp0 sh iii4 sp1 b a2 sp0 uo3 sp1 uang3 sp1 f u4 sp0 q in1 sp1 g en1 sp0 q ian5 sp0 t uei1 sp3 uo3 sp1 n iou3 sp0 d ong4 sp1 sh en1 sp0 z ii5 sp3 zh iii2 sp0 uang3 sp0 t a1 sp1 sh en1 sp0 h ou4 sp0 d uo3 sp3 uo3 sp1 g an3 sp0 d ao4 sp1 h ai4 sp0 p a4 sp3 h uen2 sp0 sh en1 sp1 b u2 sp0 z ii4 sp0 z ai5 <sos/eos>|她穿一身黑衣服,身上软乎乎的,特别好玩。她也在哭,但哭得有些特别,和母亲的哭声交相呼应。她全身都在颤抖,而且老是把我往父亲跟前推。我扭动身子,直往她身后躲;我感到害怕,浑身不自在。
12787|我还从没有见过大人们哭,而且不明白外婆老说的那些话的意思:“跟你爹告个别吧,以后你再也看不到他啦,他死了,乖孩子,还不到年纪,不是时候啊……”|<sos/eos> uo3 sp0 h ai2 sp1 c ong2 sp0 m ei2 sp0 iou3 sp1 j ian4 sp0 g uo4 sp1 d a4 sp0 r en2 sp0 m en5 sp1 k u1 sp3 er2 sp0 q ie3 sp1 b u4 sp0 m ing2 sp0 b ai2 sp1 uai4 sp0 p o2 sp1 l ao3 sp0 sh uo1 sp0 d e5 sp1 n a4 sp0 x ie1 sp0 h ua4 sp0 d e5 sp1 i4 sp0 s ii5 sp3 g en1 sp0 n i3 sp0 d ie1 sp1 g ao4 sp0 g e4 sp0 b ie2 sp0 b a5 sp3 i3 sp0 h ou4 sp3 n i3 sp1 z ai4 sp0 ie3 sp1 k an4 sp0 b u2 sp0 d ao4 sp1 t a1 sp0 l a5 sp3 t a1 sp0 s ii3 sp0 l e5 sp3 g uai1 sp0 h ai2 sp0 z ii5 sp3 h ai2 sp0 b u2 sp0 d ao4 sp1 n ian2 sp0 j i4 sp3 b u2 sp0 sh iii4 sp1 sh iii2 sp0 h ou5 sp0 a5 <sos/eos>|我还从没有见过大人们哭,而且不明白外婆老说的那些话的意思:“跟你爹告个别吧,以后你再也看不到他啦,他死了,乖孩子,还不到年纪,不是时候啊……”
1006|我得过一场大病,这时刚刚能下地。生病期间一这一点我记得很清楚——父亲照看我时显得很高兴,后来他突然就不见了,换成了外婆这个怪里怪气的人。|<sos/eos> uo3 sp1 d e2 sp0 g uo4 sp1 i4 sp0 ch ang3 sp1 d a4 sp0 b ing4 sp3 zh e4 sp0 sh iii2 sp1 g ang1 sp0 g ang1 sp1 n eng2 sp0 x ia4 sp0 d i4 sp3 sh eng1 sp0 b ing4 sp1 q i1 sp0 j ian1 sp3 i2 sp0 zh e4 sp0 i4 sp0 d ian3 sp1 uo3 sp1 j i4 sp0 d e5 sp1 h en3 sp0 q ing1 sp0 ch u5 sp3 f u4 sp0 q in1 sp1 zh ao4 sp0 k an4 sp1 uo3 sp0 sh iii2 sp2 x ian3 sp0 d e5 sp1 h en3 sp0 g ao1 sp0 x ing4 sp3 h ou4 sp0 l ai2 sp3 t a1 sp1 t u1 sp0 r an2 sp1 j iou4 sp1 b u2 sp0 j ian4 sp0 l e5 sp3 h uan4 sp0 ch eng2 sp0 l e5 sp1 uai4 sp0 p o2 sp1 zh e4 sp0 g e4 sp1 g uai4 sp0 l i3 sp1 g uai4 sp0 q i4 sp0 d e5 sp0 r en2 <sos/eos>|我得过一场大病,这时刚刚能下地。生病期间一这一点我记得很清楚——父亲照看我时显得很高兴,后来他突然就不见了,换成了外婆这个怪里怪气的人。
================================================
FILE: data/youdao/text/README.md
================================================
# 😊 voice wiki page
- Speaker info is mainly from [LibriTTS](https://www.openslr.org/60/) and [HiFiTTS](https://www.openslr.org/109/) dataset.
- You are welcome to contribute the description of voices in [EmotiVoice 😊 wiki page](https://github.com/netease-youdao/EmotiVoice/wiki/%F0%9F%98%8A-voice-wiki-page).
- You can find more speaker info from [LibriVox](https://librivox.org/) by searching their name.
| ID | Voice Name | Gender | Description |
|----|-------|--------|-------------|
| 8051 | Maria Kasper | F | Clear, soothing, expressive |
| 11614 | Sylviamb | F | Crisp, melodic, captivating |
| 9017 | John Van Stan | M | Rich, resonant, engaging |
| 6097 | Phil Benson | M | Smooth, mellow, resonant. |
| 6671 | Tony Oliva | M | Smooth, charismatic, dynamic |
| 6670 | Mike Pelton | M | |
| 9136 | Helen Taylor | F | |
| 11697 | Celine Major | F | |
| 92 | Cori Samuel | F | Lively, expressive, energetic |
| 12787 | LikeManyWaters | F | |
| 1006 | Marta Kornowska | F | |
| 1012 | Lizzie Oldfather | F | |
| 1018 | JimmyLogan | M | |
| 101 | paulino | M | |
| 1025 | rdmagpie | M | |
| 1027 | Brooks Jensen | M | |
| 1028 | Tim Lundeen | M | |
| 102 | Linda Leu | F | |
| 1034 | Kevin O'Coin | M | |
| 103 | Karen Savage | F | |
| 1040 | John Garvin | M | |
| 1046 | durnburr | M | |
| 1049 | Sam Fold | M | |
| 104 | Laura M.D. | F | |
| 1050 | entada | F | |
| 1051 | E. Moulton | F | |
| 1052 | Kathy Jacobs | F | |
| 1058 | James Tiley | M | |
| 1061 | Missie | F | |
| 1065 | Justin Brett | M | |
| 1066 | Laurie Anne Walden | F | |
| 1069 | Dawn | F | |
| 1079 | Mary aka Breadchick | F | |
| 107 | John Greenman | M | |
| 1081 | Fracture | M | |
| 1084 | Nichole Karl | F | |
| 1085 | hefyd | M | |
| 1088 | Christabel | F | |
| 1092 | Maria | F | |
| 1093 | Kiki Baessell | F | |
| 1094 | tubeyes | M | |
| 1096 | Geoff Dugwyler | M | |
| 1097 | Euthymius | M | |
| 1098 | Merryb | F | |
| 1107 | Jason Oakley | M | |
| 110 | Cynthia Lyons (1946-2011) | F | |
| 1110 | Graeme Jolliffe | M | |
| 1112 | RedToby | M | |
| 1116 | Megan Stemm-Wade | F | |
| 111 | Linda Wilcox | F | |
| 1121 | John Lieder | M | |
| 1124 | Ancilla | F | |
| 112 | Christiane Levesque | F | |
| 1132 | Giles Baker | M | |
| 1152 | Millbeach | F | |
| 1154 | Larysa Jaworski | F | |
| 1160 | Gary Gilberd | M | |
| 1161 | Dominic Moore | M | |
| 1165 | Bob Graff | M | |
| 1166 | Debra Lynn | F | |
| 1168 | Ree | F | |
| 1171 | Julia Claussen | F | |
| 1175 | Brother Patrick | M | |
| 1179 | Alan Chant | M | |
| 1182 | Brett Condron | M | |
| 1183 | roolynninms | F | |
| 1184 | Jeremy Pavier | M | |
| 1187 | Paul Hansen | M | |
| 118 | Alex Buie | M | |
| 1195 | Jennette Selig | F | |
| 119 | Alex Patterson | M | |
| 1200 | hosmer_angel | M | |
| 1222 | Joseph Ugoretz | M | |
| 1224 | Heather Duncan | F | |
| 1225 | Chris Langston | M | |
| 1226 | Russ Lemker | M | |
| 122 | J.C. | M | |
| 1230 | Ian Skillen | M | |
| 1235 | Tim Gregory | M | |
| 1239 | Scott Robbins | M | |
| 123 | Ezwa | F | |
| 1246 | Sandra | F | |
| 1250 | Christina Boyles | F | |
| 1252 | Avery | F | |
| 1258 | Mellors | M | |
| 1259 | Elizabeth Klett | F | |
| 125 | Claire Goget | F | |
| 1260 | Chris Hughes | M | |
| 1261 | Mans Broo | M | |
| 1263 | Leonie Rose | F | |
| 1265 | Edward Elmer | M | |
| 1266 | Jenilee | F | |
| 126 | Susan Denney | F | |
| 1271 | Christian Pecaut | M | |
| 1274 | Larry Gilman | M | |
| 127 | John Hicken | M | |
| 1280 | Tim Makarios | M | |
| 1283 | Paul Siegel | M | |
| 128 | ML Cohen | M | |
| 1291 | Patti Brugman | F | |
| 1296 | Gigi Minden | F | |
| 1298 | Wina Hathaway | F | |
| 1311 | Scott D. Farquhar | M | |
| 1313 | Scott Sherris | M | |
| 1323 | Leon Mire | M | |
| 1331 | Adrian Praetzellis | M | |
| 1334 | John Schell | M | |
| 1335 | Clarica | F | |
| 1336 | Charlie Blakemore | M | |
| 133 | Mick | M | |
| 1341 | Coastalbloke | M | |
| 1342 | SueAnn Dozier | F | |
| 1343 | Laura Koskinen | F | |
| 1347 | Ted Nugent | M | |
| 1349 | John Pruden | M | |
| 1353 | Clarke Bell | M | |
| 1355 | Chris Gladis | M | |
| 1363 | Tammy Sanders | F | |
| 1365 | Joel Poortenga | M | |
| 1367 | Joe Brenneman | M | |
| 1370 | Lee Elliott | F | |
| 1373 | Kira Belkin | F | |
| 1374 | Graham Thomsen | M | |
| 1379 | Ken Crooker | M | |
| 1384 | Stephen Lamb | M | |
| 1387 | Scott Mather | M | |
| 1392 | Chris Masterson | M | |
| 1403 | tipaew | M | |
| 1414 | guava | F | |
| 1417 | Psuke Bariah | F | |
| 1421 | Madame Tusk | F | |
| 1422 | Yazpistachio | F | |
| 1425 | Jeanette Ferguson | F | |
| 1430 | Alok Karulkar | M | |
| 1444 | Ryan Mease | M | |
| 1445 | Michael Yard | M | |
| 1447 | Luigina | F | |
| 1448 | marevalo | F | |
| 1455 | webslog | M | |
| 1460 | E. Plein | F | |
| 1463 | Vivian Bush | F | |
| 1469 | Fr. Richard Zeile of Detroit | M | |
| 1474 | Jc Guan | F | |
| 147 | Thomas Hoover | M | |
| 1485 | Robert Flach | M | |
| 1487 | radioreader | M | |
| 1492 | mb | M | |
| 1494 | George Deprez, PhD | M | |
| 1495 | Glendower Jones | M | |
| 1498 | Lori Hebel | F | |
| 1502 | Ann Boyer | F | |
| 1505 | Mark Norman | M | |
| 1509 | Miranda Stinson | F | |
| 150 | Fox in the Stars | F | |
| 1513 | Simon-Peter Zak | M | |
| 151 | Gwen | F | |
| 152 | Andy Minter | M | |
| 1535 | Robert Scott | M | |
| 1536 | Marco | M | |
| 153 | Graham Williams | M | |
| 1544 | LilianaVale | F | |
| 1545 | AmyAG | F | |
| 1547 | Riddleman | F | |
| 154 | Robert Foster | M | |
| 1552 | Roger Turnau | M | |
| 1553 | Mim Ritty | F | |
| 1556 | geofred | M | |
| 1559 | Luke Harrison | M | |
| 1563 | Chandra Gioiello | F | |
| 1564 | Hedvig | F | |
| 1566 | Anna Christensen | F | |
| 1569 | Kristine Mackin | F | |
| 1571 | Bob Tassinari | M | |
| 1572 | Alan Clare | M | |
| 1578 | Lorelle Anderson | F | |
| 1579 | Philippa Willitts | F | |
| 1593 | Kristine Bekere | F | |
| 1594 | Jon Scott Jones | M | |
| 1595 | Riccardo Fasol | M | |
| 159 | hugh mac | M | |
| 1601 | Michael Yourshaw | M | |
| 1603 | Arouet | M | |
| 1607 | Claude Banta | M | |
| 1614 | FNH | M | |
| 1618 | Nicholas James Bridgewater | M | |
| 161 | Cyril Law, Jr. | M | |
| 1621 | Caliban | M | |
| 1624 | Daniel Shorten | M | |
| 1633 | Beecher | F | |
| 1636 | Sandra Zera | F | |
| 1639 | Joe Konno | M | |
| 163 | Andrew Miller | M | |
| 1641 | Rohanna | F | |
| 1643 | Chris Leslie-Hynan | M | |
| 1645 | David Shamp | M | |
| 1646 | Ben Cobbett | M | |
| 1647 | Rich Meyers | M | |
| 1648 | Accent | F | |
| 1653 | Carmina Sansone | F | |
| 1664 | Shauna M | F | |
| 1665 | Jessica AC Snyder | F | |
| 1668 | stepheather | F | |
| 1674 | Jo | F | |
| 1679 | Polly | F | |
| 167 | Peter Yearsley | M | |
| 1680 | intothelight | F | |
| 1681 | islajane | F | |
| 1685 | Jonathan Horniblow | M | |
| 168 | Chris Goringe | M | |
| 1690 | Anne-Marie | F | |
| 1691 | Classicsfan | F | |
| 1693 | 4Cullen | F | |
| 1695 | Steph | F | |
| 1696 | Darcywil | F | |
| 1699 | Gavin Smith | M | |
| 16 | Alys AtteWater | F | |
| 1704 | JB | F | |
| 1705 | tittletattle | F | |
| 1708 | Alaaious | M | |
| 1710 | Gilly | F | |
| 1714 | lauralee | F | |
| 1717 | PJ | F | |
| 1721 | Linnea | F | |
| 1726 | janeite | F | |
| 1731 | Dani | F | |
| 1733 | Mira Cheskis | F | |
| 1736 | LC | F | |
| 1737 | Erin Hastings | F | |
| 173 | vlooi | F | |
| 1743 | Bryan Ness | M | |
| 1746 | Theo Bacher | M | |
| 1748 | Brad Powers | M | |
| 1750 | Lorie Heinrichs | F | |
| 1754 | Joan Freeman | F | |
| 1756 | Tamara Hamilton | F | |
| 1757 | cricket | F | |
| 175 | Meredith Hughes | F | |
| 1760 | Matthew Howell | F | |
| 1765 | Kelly Elizabeth | F | |
| 1767 | Cori Dean | F | |
| 1769 | ej | M | |
| 176 | Vinny Bove | M | |
| 1772 | David A. Stokely | M | |
| 1773 | Eliza Horne | F | |
| 1777 | Professor Chronotis | M | |
| 1779 | Cynthia Zocca | F | |
| 177 | Kymm Zuckert | F | |
| 1780 | Micah | M | |
| 1784 | grovejade | F | |
| 1789 | Vin Reilly | M | |
| 1795 | Muhammad Mussnoon | M | |
| 1801 | Antonio | M | |
| 1804 | Marie Manis | F | |
| 1809 | cucciasv | F | |
| 1811 | Eric Ray | M | |
| 1813 | tesoro007 | F | |
| 1815 | Aringguth | M | |
| 1819 | Shannon | F | |
| 1825 | srshel | F | |
| 1826 | Jacob Miller | M | |
| 1828 | James Gladwin | M | |
| 1841 | Laura Caldwell | F | |
| 1844 | noonday | M | |
| 1846 | valikojohn | M | |
| 1849 | Kelly Dougherty | M | |
| 1851 | Kehinde | F | |
| 1859 | Jan Baxter | F | |
| 1863 | Ania | F | |
| 1867 | Rowdy Delaney | M | |
| 1868 | Graham Redman | M | |
| 1870 | Stuart Bell | M | |
| 1874 | Ernst Schnell | M | |
| 1878 | BLRossow | M | |
| 1885 | inkwelldragon | F | |
| 188 | Mary Anderson | F | |
| 1898 | Jennifer | F | |
| 1901 | Allyson Hester | F | |
| 1903 | Michael Thomas Robinson | M | |
| 1913 | Geoff Cowgill | M | |
| 1920 | Annika Feilbach | F | |
| 1923 | Maire Rhode | F | |
| 1924 | Andrew Drinkwater | M | |
| 1926 | Nikki Sullivan | F | |
| 1931 | poormedea | F | |
| 1938 | icyjumbo (1964-2010) | M | |
| 1943 | Corun | M | |
| 1944 | Carolyn Frances | F | |
| 1963 | Belinda Brown | F | |
| 1968 | lizzyblack | F | |
| 196 | Stewart Wills | M | |
| 1970 | Dawn Larsen | F | |
| 1974 | Katie Baynes | F | |
| 1977 | Jennie Hughes | F | |
| 1985 | Jonny Lee | M | |
| 1987 | Michael Macedonia | M | |
| 1989 | Sergio Baldelli | M | |
| 198 | Heather Barnett | F | |
| 1992 | Michelle White | F | |
| 199 | Maria Morabe | F | |
| 19 | Kara Shallenberg | F | |
| 2001 | Phillip David | M | |
| 2002 | Larry Maddocks | M | |
| 2003 | The Penang Lawyer | M | |
| 2004 | Kim S | F | |
| 2007 | Sheila Morton | F | |
| 200 | Maureen S. O'Brien | F | |
| 2010 | Julie Bynum | F | |
| 2012 | jburby | M | |
| 2013 | Mark | M | |
| 201 | Joplin James | M | |
| 2021 | Keri Ford | M | |
| 2026 | Mil Nicholson | F | |
| 202 | Geetu Melwani | F | |
| 2039 | Anton | M | |
| 203 | Marian Brown | F | |
| 2042 | Charlene V. Smith | F | |
| 2046 | kyleti | M | |
| 204 | Mark F. Smith | M | |
| 2050 | Xe Sands | F | |
| 2051 | Grant Petersen | M | |
| 205 | Esther | F | |
| 2060 | Julie Pandya | F | |
| 2061 | Jodi Krangle | F | |
| 2062 | Mindy H | F | |
| 2063 | hearhis | M | |
| 2067 | Nick Gisburne | M | |
| 2068 | Priya, India | F | |
| 207 | Kevin McAsh | M | |
| 2089 | Martina | F | |
| 208 | Andrea L | F | |
| 2090 | Melissa | F | |
| 2092 | Elaine Hamby | F | |
| 2096 | Nick Marsh | M | |
| 209 | Moira Fogarty | F | |
| 20 | Gesine | F | |
| 2100 | Katherine Holt | F | |
| 2104 | R. S. Steinberg | M | |
| 210 | Aldark | M | |
| 2110 | Aaron Elliott | M | |
| 2113 | Andrew Vidal | M | |
| 211 | shanda_w | F | |
| 2122 | Kenneth R. Morefield | M | |
| 2127 | wrongshore | M | |
| 2133 | Mat Messerschmidt | M | |
| 2136 | Great Plains | M | |
| 2140 | Ralph Snelson | M | |
| 2143 | Cat Schirf | F | |
| 2148 | BethAnne | F | |
| 2149 | Mark Penfold | M | |
| 2152 | redabrus | F | |
| 2156 | Roger Melin | M | |
| 2159 | Matthew Westra | M | |
| 215 | Alice Elizabeth Still | F | |
| 2167 | spiderman0521 | M | |
| 2182 | Susan Umpleby | F | |
| 2185 | Jonathan Feldman | M | |
| 218 | Kelly Clear | M | |
| 2194 | RobbieRogers | F | |
| 2195 | Joe Earley | M | |
| 2196 | Andrea Fiore | F | |
| 2198 | Clive Catterall | M | |
| 2208 | Alan Brown | M | |
| 2229 | Pete Williams, Pittsburgh, PA | M | |
| 2230 | Isosceles | F | |
| 2234 | Lars Rolander | M | |
| 2237 | Chloey Winters | F | |
| 2238 | Will Larson | M | |
| 2240 | Ralph Volpi | M | |
| 2246 | RaySee | M | |
| 224 | Caitlin Kelly | F | |
| 2254 | Heidi Preuss | F | |
| 2256 | tamurile | F | |
| 225 | Brenda Dayne | F | |
| 2262 | Andy | M | |
| 2269 | Rhonda Federman | F | |
| 226 | Deb Bacon-Ziegler | F | |
| 2270 | Megan Kunkel | F | |
| 2272 | Alec Daitsman | M | |
| 2273 | Peter Kelleher | M | |
| 2275 | Lori H | F | |
| 2276 | Andrea | F | |
| 2279 | Gilles Lehoux | M | |
| 227 | Sarah Key-DeLyria | F | |
| 2284 | Zapo | M | |
| 2288 | Ellis Christoff | F | |
| 2289 | David Kleparek | M | |
| 228 | Arctura | F | |
| 2292 | Dick Durette | M | |
| 2294 | James Christopher | M | |
| 2297 | Philippa | F | |
| 2299 | cpalmer17 | M | |
| 229 | carnright | M | |
| 2301 | Chris Jones | F | |
| 2309 | Wyatt | M | |
| 2312 | Lucy Lo Faro | F | |
| 2319 | Jack Farrell | M | |
| 231 | Sean McGaughey | M | |
| 2339 | skellie | F | |
| 233 | Steve Karafit | M | |
| 2341 | webround | M | |
| 2346 | FirstKnight | F | |
| 2351 | hugoceline | F | |
| 2356 | Paul Curran | M | |
| 2361 | M. J. Boyle | F | |
| 2364 | Anna-Maria Viola | F | |
| 2368 | Alex C. Telander | M | |
| 2374 | M.C.Y. | F | |
| 2380 | Jacob Cherry | M | |
| 2384 | Ger | M | |
| 238 | Maria Elmvang | F | |
| 2391 | treefingers | F | |
| 2393 | Michael Bradford | M | |
| 2397 | texttalker | M | |
| 2401 | Matt Warzel | F | |
| 2404 | n8evv | M | |
| 2405 | musil | M | |
| 2407 | ajmacbeth | M | |
| 240 | Shurtagal | M | |
| 2416 | Julia Albath | F | |
| 242 | Cagirlwithasoutherndrawl | F | |
| 2436 | Seth Adam Sher | M | |
| 2437 | Wetcoast | M | |
| 243 | Jennifer Stearns | F | |
| 2445 | musici123 | F | |
| 2448 | David Federman | M | |
| 245 | Peter of Buckinghamshire England | M | |
| 2485 | Serin | F | |
| 2487 | Rachel Lintern | F | |
| 2488 | Lisa Wilson | F | |
| 248 | Becky Miller | F | |
| 2491 | johnb | M | |
| 2494 | Mark Cawley | M | |
| 2496 | Ben Dutton | M | |
| 2498 | B. Grebe | F | |
| 2499 | Paul Henry Tremblay | M | |
| 249 | pww214 | M | |
| 2504 | Helen Elsbeth | F | |
| 250 | Mary Reagan | F | |
| 2512 | Marion | F | |
| 2514 | S. Young | M | |
| 2517 | Gayland Darnell | M | |
| 2518 | Rob Powell | M | |
| 2522 | senshisteph | F | |
| 2526 | Bob Gilham | M | |
| 252 | Rainer | M | |
| 2531 | Greg Weeks | M | |
| 253 | Stefan Schmelz | M | |
| 2541 | Eddie Winter | M | |
| 2544 | Annise | F | |
| 2545 | the quiet fox | M | |
| 254 | Alan Davis Drake (1945-2010) | M | |
| 2552 | Daniel Cranston | M | |
| 2553 | daisy55 | F | |
| 255 | Chris Hawk | M | |
| 2568 | Elena the Quiet | F | |
| 2570 | kindlibrarian | F | |
| 2573 | Becca B | F | |
| 2574 | TimSC | M | |
| 2577 | K Hindall | F | |
| 2587 | Anne Cheng | F | |
| 2588 | Padraig O'hIceadha | M | |
| 2589 | Jordan | M | |
| 258 | Kurt Wong | M | |
| 2598 | Barbara Bulkeley | F | |
| 25 | John Gonzalez | M | |
| 2606 | Marc Tanti | M | |
| 2607 | Ruth Golding | F | |
| 2624 | David Nicol | M | |
| 2628 | Zloot | M | |
| 2638 | Dawn | F | |
| 263 | Michael Sirois | M | |
| 264 | Chris Hughes | M | |
| 2652 | MixieArmadillo | F | |
| 2654 | Notelrac | M | |
| 265 | Janice | M | |
| 2660 | mpetranech | M | |
| 2671 | Foreign Girl | F | |
| 2673 | jude kaider | M | |
| 2674 | Jason Procopio | M | |
| 2676 | missizii | F | |
| 2691 | Donna Stewart | F | |
| 2694 | DianaJMB | F | |
| 26 | Denny Sayers | M | |
| 2712 | anoldfashiongirl | F | |
| 2724 | Michael Dalling | M | |
| 272 | Mr. Baby Man | M | |
| 2730 | Shirley Anderson | F | |
| 2733 | CalmDragon | M | |
| 2735 | ASchindler | F | |
| 273 | Jim Cadwell | M | |
| 2740 | Tony Ashworth | M | |
| 2741 | Jan Dawn Doronila | F | |
| 2748 | Annoying Twit | F | |
| 274 | Eileen George | F | |
| 2754 | peaceuntoyou | F | |
| 2762 | Phillipa Chantry | F | |
| 2764 | Piper Hale | F | |
| 2769 | Anthony Wilson | M | |
| 2775 | ink tree | F | |
| 277 | Alessia | F | |
| 2785 | humeangel | F | |
| 2787 | Quentin Manuel | M | |
| 278 | AliceG | F | |
| 27 | Sean McKinley | M | |
| 2812 | Greg Hartley | M | |
| 2817 | Catherine Millward | F | |
| 2825 | Ernst Pattynama | M | |
| 2827 | David Leeson | M | |
| 2834 | Ksushi | F | |
| 2836 | Linda McDaniel | F | |
| 283 | Asaf Bartov | M | |
| 2843 | ricell | M | |
| 2853 | Jane Greensmith | F | |
| 2854 | Andrew Coleman | M | |
| 2882 | ayngelwing | F | |
| 2893 | Ryan Sutter | M | |
| 2895 | Jenny Lundak | F | |
| 289 | Barbara Wedge | F | |
| 28 | Kristin Hughes | F | |
| 2909 | Petra | F | |
| 2910 | Janna | F | |
| 2911 | David Lawrence | M | |
| 2919 | Raerity | F | |
| 2920 | Rechelle | F | |
| 2925 | Darla | F | |
| 2930 | BUAES | M | |
| 2943 | Sarah Gutierrez | F | |
| 2946 | Markus Wachenheim | M | |
| 294 | Calliope | F | |
| 2952 | Scott Carpenter | M | |
| 2960 | Scotty | M | |
| 2967 | Landii | F | |
| 2971 | Matthew C. Heckel | M | |
| 2975 | Sarafina Suransky | F | |
| 2979 | Jilliane Brandt | F | |
| 2985 | Cantor | M | |
| 2988 | Larissa Little | F | |
| 2989 | Jamie Strassenburg, Cypress, California | F | |
| 298 | Caroline Morse | F | |
| 2990 | Tom Crawford | M | |
| 2992 | davechase | M | |
| 2997 | Violet | F | |
| 2998 | Kim Jansen | M | |
| 2999 | Joseph Finkberg | M | |
| 29 | Linton | M | |
| 3003 | Sue Anderson | F | |
| 3006 | MorganScorpion | F | |
| 3008 | Gloria Zbilicki | F | |
| 3020 | Mike Vendetti | M | |
| 3021 | leetcr | M | |
| 3025 | MichelleHarris | F | |
| 302 | Chris Peterson | F | |
| 3033 | valli | F | |
| 303 | Tony Hightower | M | |
| 3045 | Cameron Conaway | M | |
| 3046 | Stephanie Land | F | |
| 3053 | Tracy Yonemoto | F | |
| 3054 | GerryR | M | |
| 3060 | Didier | M | |
| 3063 | markman | M | |
| 3079 | nivedita | F | |
| 307 | Randy Phillips | M | |
| 3082 | Logan McCamon | M | |
| 3088 | Sean O'Hara | M | |
| 3090 | kelcymx | F | |
| 3094 | moe | F | |
| 3097 | nitram | M | |
| 3098 | woggy298 | M | |
| 30 | Annie Coleman Rothenberg | F | |
| 3100 | David Higham | M | |
| 3105 | gfairch511 | M | |
| 3109 | Diogenes Dog | M | |
| 310 | Dexnell Peters | F | |
| 3112 | Jessica Louise | F | |
| 3114 | Geoffrey Edwards | M | |
| 3118 | George Yeager | M | |
| 3119 | Sharon Riskedahl | F | |
| 311 | deadwhitemales | M | |
| 3125 | Fran | F | |
| 3132 | Andy Yu | M | |
| 3135 | Steve Foreman | M | |
| 3137 | Parrot | M | |
| 3138 | Labyrinth Composer | F | |
| 313 | Dilini Jayasinghe | F | |
| 3142 | RogerA | M | |
| 3143 | suzanne | F | |
| 3144 | jfmarchini | M | |
| 3148 | artos | M | |
| 3157 | TriciaG | F | |
| 3168 | David Anton | M | |
| 3172 | Beatrice | F | |
| 3179 | Robin | F | |
| 317 | Mike Gardom | M | |
| 3180 | Mike Conrad | M | |
| 3192 | Arfuhrm | M | |
| 3196 | Elizabeth Harker | F | |
| 319 | Ed Good | M | |
| 31 | Martin Clifton | M | |
| 3214 | fourteatoo | M | |
| 3215 | Shirley Ellen | F | |
| 3224 | Acacia Wood | F | |
| 3227 | Betina | F | |
| 322 | Elisabeth Shields | F | |
| 3230 | rasputin | M | |
| 3235 | Karen Commins | F | |
| 3238 | nihilist00 | M | |
| 3240 | flakker | M | |
| 3242 | peac | M | |
| 3244 | wilwarin | F | |
| 3245 | wendy | F | |
| 3257 | Jay Vance | M | |
| 3258 | mwalimu | F | |
| 3259 | Kate West | F | |
| 3261 | fourgrays | M | |
| 3268 | Patrick McHaffie | M | |
| 3271 | Ancient mariner | M | |
| 3272 | Matthew_J_Almeida | M | |
| 3274 | Morgan Saletta | M | |
| 3285 | David Collins | M | |
| 3288 | Euan Bayliss | M | |
| 3289 | lukeprog | M | |
| 3290 | Marian Martin | F | |
| 32 | Betsie Bush | F | |
| 3307 | Doug Allison | M | |
| 3314 | Carol Stripling | F | |
| 3318 | Magdalena | F | |
| 3319 | mjbrichant | F | |
| 331 | Richard Grove | M | |
| 332 | Aaron Teiser | M | |
| 3334 | joi | F | |
| 3340 | Preston McConkie | M | |
| 3346 | Hannah Dowell | F | |
| 3356 | Diana Solomon | F | |
| 3357 | swade | F | |
| 335 | Paul Harvey | M | |
| 3361 | Linda Lee Paquet | F | |
| 336 | Harvey Chinn | M | |
| 3370 | Glenn Simonsen | M | |
| 3373 | cvd | M | |
| 3374 | Craig Campbell | M | |
| 3379 | Kele | F | |
| 337 | Barbara Harvey | F | |
| 3380 | DrBeccaAnne | F | |
| 3381 | Cagliostro | M | |
| 3389 | von | M | |
| 3394 | Jackie Provau | F | |
| 3400 | Laura Davis | F | |
| 3409 | Philippa Brodie | F | |
| 340 | Scott Henkel | M | |
| 3411 | SuD | F | |
| 3417 | Albatross | M | |
| 3433 | Bob Sherman | M | |
| 3436 | Anders Lankford | M | |
| 3440 | Heidi Will | F | |
| 3446 | kayo | F | |
| 3448 | Todd Lennon | M | |
| 345 | Micah Sheppard | M | |
| 3465 | ravenotation | F | |
| 3467 | js392 | F | |
| 3470 | Jason Mills | M | |
| 3479 | Karan Yamada | F | |
| 3482 | Hayden | F | |
| 3486 | Robin Balmer | M | |
| 3488 | Tom Weiss | M | |
| 348 | ianish | M | |
| 3490 | Gregg Margarite (1957-2012) | M | |
| 3500 | B. Treadgold | F | |
| 3503 | Christian Al-Kadi | M | |
| 3513 | Symmie | F | |
| 3521 | NickNumber | M | |
| 3526 | Bereni | F | |
| 3537 | Tracy Datlen | F | |
| 353 | Jamey Osborne | M | |
| 3541 | Termin Dyan | M | |
| 3546 | Jeannie | F | |
| 3547 | BenW | M | |
| 3551 | Annie Kirkpatrick | F | |
| 3553 | Luc Kordas | M | |
| 3554 | LaraC, Louisville, KY | F | |
| 3557 | Rachel Triska | F | |
| 3559 | Kerry Hiles | F | Soothing, clear, inviting |
| 3564 | Vanessa | F | |
| 3567 | David Lazarus | M | |
| 3571 | HarryInk | M | |
| 3584 | Bridget Gaige | F | |
| 3587 | John Nixon | M | |
| 3588 | Neeru Iyer | F | |
| 3592 | Paul McCartan | M | |
| 3595 | Martin Geeson | M | |
| 3598 | Dawn | F | |
| 3606 | Ashwath Ganesan | M | |
| 3607 | Richard Wallis | M | |
| 3618 | Timothy Ferguson | M | |
| 362 | Judith Brown | F | |
| 3630 | Rachel Gatwood | F | |
| 3638 | AmyG | F | |
| 3641 | Joelle Peebles | F | |
| 3645 | MaryAnn | F | |
| 3647 | Channe | F | |
| 3650 | Jonathan Ross | M | |
| 3654 | Mark Wilson | M | |
| 3656 | Kai Lu | M | |
| 3657 | Bellona Times | M | |
| 365 | Jon Ingram | M | |
| 3664 | Barry Eads | M | |
| 3665 | C.J. Casey | M | |
| 366 | Katy Preston | F | |
| 3675 | Linda Ferguson | F | |
| 3679 | veronasser | F | |
| 3681 | Ann Boulais | F | |
| 3691 | Hollis Hanover | M | |
| 3698 | Nadine Eckert-Boulet | F | |
| 3699 | Bruce Pirie | M | |
| 369 | Kevin Readdean | M | |
| 36 | Chip | M | |
| 3703 | Linda Andrus | F | |
| 3723 | Kevin Lavin | M | |
| 3728 | amycs | F | |
| 3733 | Melanie Schleeter McCalmont | F | |
| 3738 | Collee McKinnon | F | |
| 373 | Kim Braun | F | |
| 3744 | Jonathan Burchard | M | |
| 3747 | Keith Henige | M | |
| 374 | kumarei | M | |
| 3757 | EmAllise | F | |
| 3779 | Rachel Steely | F | |
| 377 | Lenny Glionna Jr. | M | |
| 3780 | Pete | M | |
| 3781 | Celena Arter | F | |
| 3783 | TexasSteve | M | |
| 3793 | Nathan | M | |
| 3796 | Mario Pineda | M | |
| 3798 | Bianca Kramer | F | |
| 37 | wolvrin | M | |
| 3807 | Jesse Noar | M | |
| 380 | Laurie Campbell | F | |
| 3819 | StarrDog | M | |
| 3830 | rymd80 | M | |
| 3835 | M.White | M | |
| 3843 | storm | F | |
| 3845 | Ray Smith | M | |
| 3848 | skoval | F | |
| 3851 | mbousquet | F | |
| 3852 | selniff | F | |
| 3857 | Epistomolus | M | |
| 3864 | Tom Watts | M | |
| 3866 | SilverG | M | |
| 3867 | Roberta Carlisle | F | |
| 3869 | Timothy Pinkham | M | |
| 3871 | Figura | M | |
| 3876 | Frances Marcinkiewicz | F | |
| 3879 | Keneva | F | |
| 3885 | Elli | F | |
| 3894 | Indy Gosal | M | |
| 3895 | porlob | M | |
| 3896 | Will Zufall | M | |
| 38 | R. Francis Smith | M | |
| 3905 | J. Rebecca Franklin | F | |
| 3906 | tabithat | F | |
| 3909 | Evelyn Clarke | F | |
| 3911 | Joseph Couves | F | |
| 3912 | Bob Neufeld | M | |
| 3922 | Ashley Candland | F | |
| 3923 | Sean Michael Hogan | M | |
| 3925 | Viglione | F | |
| 3926 | Denise Lacey | F | |
| 3928 | Marianne Coleman-Hipkins | F | |
| 392 | Maria Celano | F | |
| 3934 | Lynne Carroll | F | |
| 3945 | Floyd Wilde | M | |
| 3947 | johnell | F | |
| 3955 | Fredrik Karlsson | M | |
| 3959 | rjhargrav | M | |
| 3962 | writerboyontour | M | |
| 3969 | CM Slosson | F | |
| 3972 | Joy Easton | F | |
| 3977 | LivelyHive | M | |
| 3979 | Dale A. Bade | F | |
| 3982 | Kate Adams | F | |
| 3983 | lavocedorata | F | |
| 398 | James Smith | M | |
| 3990 | Jessi | F | |
| 3992 | perpetualdreamworld | F | |
| 3994 | Miriam Esther Goldman | F | |
| 39 | Sherry Crowther | F | |
| 4005 | Jhiu | F | |
| 4009 | Diana Majlinger | F | |
| 4010 | David Baldwin | M | |
| 4013 | Kevin Maxson | M | |
| 4014 | Tom Clifton | M | |
| 4015 | JimOCR | M | |
| 4017 | gsolgaard | M | |
| 4018 | Nicholas Clifford | M | |
| 4019 | brrrrrr6 | M | |
| 4020 | Linda | M | |
| 4021 | Linda Woods | F | |
| 402 | Sharmini Kumar | F | |
| 4034 | Sienna | F | |
| 4039 | Shawn Craig Smith | M | |
| 403 | Nocturna | F | |
| 4042 | Ryan DeRamos | M | |
| 4044 | serenitylee | F | |
| 404 | Nomenphile | F | |
| 4051 | Liz Devens | F | |
| 4054 | Ryan Gubele | M | |
| 4057 | RoseA | F | |
| 4059 | Troy Bond | M | |
| 405 | Eric Dennison | M | |
| 4063 | Abigail Bartels | F | |
| 4064 | Margaret Espaillat | F | |
| 4071 | Nichelle von Lauder | F | |
| 4078 | Richard Kilmer | M | |
| 4085 | Paul P Miller | M | |
| 4088 | Blazin48 | F | |
| 408 | Claudine Chen | F | |
| 4090 | madmouth | F | |
| 4098 | Rachell Lovett | F | |
| 409 | Mike Kauffmann | M | |
| 40 | Vicki Barbour | F | |
| 4104 | Linda Dodge | F | |
| 4108 | garymacf | M | |
| 4110 | Richard Ellwood | M | |
| 4111 | Rachel P. | F | |
| 4122 | Wendel Topper | M | |
| 412 | Brian Roberg | M | |
| 4137 | Sarah LuAnn | F | |
| 4138 | daltongirl | F | |
| 413 | Daniel Watkins | M | |
| 4145 | Patti Cunningham | F | |
| 4152 | Ata Khudayberdiev | M | |
| 4156 | Caroline Shapiro | F | |
| 4160 | Rosie | F | |
| 4161 | Daniel Paashaus | M | |
| 4172 | Graeme Dunlop | M | |
| 4174 | Availle | F | |
| 4179 | Robert Keiper | M | |
| 4189 | Megan Argo | F | |
| 4191 | Grant Hurlock | M | |
| 4192 | MaryModern | F | |
| 4193 | Ethan Rampton | M | |
| 4195 | bj | F | |
| 4196 | Jim Clevenger | M | |
| 4205 | psi_mon | M | |
| 4211 | A. Knight | F | |
| 4214 | A. Janelle Risa | F | |
| 4216 | Hannah Skoonberg | F | |
| 4217 | Brendan Tannam | M | |
| 4218 | David Cole | M | |
| 421 | Patrick | M | |
| 4225 | gmiteva | F | |
| 4234 | laineyben | F | |
| 4235 | Haylayer Flaga | F | |
| 4238 | Chela | F | |
| 4243 | Ian Grae | M | |
| 4257 | garbageman99 | M | |
| 4262 | LoraBeth Davis | F | |
| 4263 | Chelsea Baker | F | |
| 4267 | Ric F | M | |
| 426 | Norah Piehl | F | |
| 4273 | as101 | F | |
| 4277 | JohanG | M | |
| 4280 | BB | F | |
| 428 | Rayburn Beale | M | |
| 4295 | Slawek | M | |
| 4297 | Tina Horning | F | |
| 4305 | Aspergine | F | |
| 4310 | grace4him | F | |
| 4313 | May Low | F | |
| 4321 | Xenutia | F | |
| 4327 | brokenaltar | F | |
| 432 | Steve Andersen | M | |
| 4331 | Barbara Clements | F | |
| 4335 | davidb | M | |
| 4340 | kiwafruit | F | |
| 4344 | Tadhg | M | |
| 4345 | Richard Schipper | M | |
| 4352 | Martina Hutchins | F | |
| 4356 | Patricia Rutledge | F | |
| 4362 | Michelle Montano | F | |
| 4363 | Emily Livingston | F | |
| 4379 | Scott Dahlem | M | |
| 4381 | Denise Resnik | F | |
| 4396 | Michael Wolf | F | |
| 4397 | John Dennison | M | |
| 439 | Robert Garrison | M | |
| 4402 | Christopher Sanner | M | |
| 4406 | Matthew Scott Surprenant | M | |
| 4407 | Ted Drury | M | |
| 4411 | Zarnaz | F | |
| 4415 | Anita Fleming | F | |
| 4420 | Steve Lomas | M | |
| 4422 | Kamna | F | |
| 4423 | David Dwight | M | |
| 4427 | Lynne Handler | F | |
| 4428 | Blueoyster101 | M | |
| 4433 | Ken Sterry | M | |
| 4434 | Sarah Nuxoll | F | |
| 4441 | William Peck | M | |
| 4442 | Pep | M | |
| 4443 | THOVO | F | |
| 4447 | Cascades | M | |
| 444 | Sage Tyrtle | F | |
| 4455 | Patrick Wells | F | |
| 4463 | Cate Mackenzie | F | |
| 446 | Steve Hartzog | M | |
| 4474 | John L. Clark | M | |
| 4480 | Iskander Shafikov | M | |
| 4481 | margo zinberg | F | |
| 4484 | Phil Griffiths | M | |
| 4487 | Nienke | F | |
| 448 | scrappylibrarian | F | |
| 4490 | Rachel Weaver | F | |
| 4492 | P.Hynes | F | |
| 4495 | Dillon Stiles | M | |
| 44 | travelbratd | F | |
| 4511 | Jeanie | F | |
| 4513 | Gabi | F | |
| 4519 | Mimi Wang | F | |
| 451 | Sonserae Leese-Calver | F | |
| 4520 | Dorlene Kaplan | F | |
| 4535 | Brett W. Downey | M | |
| 453 | Glen Hallstrom | M | |
| 4545 | SunshinePaul | M | |
| 4546 | Estelle Jobson | F | |
| 4549 | Kristen Zaza | F | |
| 454 | Tom Yates | M | |
| 4563 | Wiebke | F | |
| 4576 | Snaefaxi | F | |
| 4583 | Jersey City Frankie | M | |
| 4586 | Chris Caron | M | |
| 458 | Scott Splavec | M | |
| 4591 | Robert White | M | |
| 4592 | WestWestest | F | |
| 4594 | mailman61953 | M | |
| 4598 | cher0520 | F | |
| 4599 | xibu | M | |
| 459 | Mark Bradford | M | |
| 45 | Kelly Bescherer | F | |
| 460 | Dave Ranson | M | |
| 4640 | Karen Mason | F | |
| 4652 | Savanna Herrold | F | |
| 4659 | Stephen Marsh | M | |
| 4660 | SusieSA | F | |
| 4667 | Maria Therese | F | |
| 466 | Joy Chan | F | |
| 4680 | pachayes | F | |
| 4681 | Frank Adams | M | |
| 4687 | mevans | M | |
| 4693 | Robert Parker | M | |
| 4697 | Jannie Meisberger | F | |
| 4699 | Jason Justice | M | |
| 46 | Aaron Hochwimmer | M | |
| 4701 | CC | M | |
| 4703 | HurstPP | F | |
| 4705 | Algy Pug | M | |
| 4706 | SallyMc | F | |
| 470 | Chris Chapman | M | |
| 4710 | David Huston | M | |
| 4712 | Alisson Veldhuis | F | |
| 4719 | M. Craun | M | |
| 472 | Tina Tilney | F | |
| 4731 | Becky Cook | F | |
| 4738 | Leonard Wilson | M | |
| 4741 | Nullifidian | M | |
| 4742 | Little Tee | F | |
| 4744 | Amy Gramour | F | |
| 4748 | Dirk Eichhorn | M | |
| 474 | Zachary Brewster-Geisz | M | |
| 4750 | Paul Huckerby | M | |
| 4757 | Grace Dobson | F | |
| 475 | Jason X. | M | |
| 4766 | Melanie | F | |
| 4767 | Delysid | M | |
| 476 | Chuck Spann | M | |
| 4771 | scrawl | M | |
| 4773 | Kathryn Lois | F | |
| 4779 | Angel5 | F | |
| 4788 | Bill Boerst | M | |
| 4791 | MelanieMae | F | |
| 4799 | Matt Judd | M | |
| 479 | wedschild | F | |
| 47 | Amanda | F | |
| 4800 | Mary Herndon Bell | F | |
| 4806 | Jason Ingolfsland | M | |
| 480 | Chris Vee | M | |
| 4813 | Steve Mattern | M | |
| 481 | Neal Foley | M | |
| 4821 | Zachary Johnson | M | |
| 4824 | meyerli | F | |
| 4830 | George Aalto | M | |
| 4836 | Preston Scrape | M | |
| 4837 | Sharon Kilmer | F | |
| 483 | junk science | F | |
| 4841 | Haley Pereira | F | |
| 4846 | Kathrin Salazar | F | |
| 4848 | Dee Wykoff | M | |
| 4853 | Barbara Derksen | F | |
| 4854 | Doctor_wu | M | |
| 4859 | nathank | M | |
| 4860 | Jonah Cummings | M | |
| 4863 | I M CLIFFORD | M | |
| 4872 | R E Faust | M | |
| 4894 | Gary Dzierlenga | M | |
| 4898 | greatbasinrain | M | |
| 4899 | Theresa L. Downey | F | |
| 489 | Tora | F | |
| 4910 | Amanda Martin Sandino | F | |
| 4915 | Andrew Bowles | M | |
| 4926 | browneyedgirl32382 | F | |
| 4930 | Adrian Levitsky | M | |
| 4931 | KevS | M | |
| 4936 | jedopi | F | |
| 4948 | Tom Barron | M | |
| 4955 | Elwood Mott | M | |
| 4958 | David P. Sroka | M | |
| 4959 | Piper Hayes | F | |
| 4964 | rashada | F | |
| 4965 | Rachel Craig | F | |
| 4969 | Garth Burton | M | |
| 4973 | Michael Lipschultz | M | |
| 4979 | Eric | M | |
| 497 | audiotoshokan | M | |
| 4991 | Jacqueline (Jacqui) Grady | F | |
| 4993 | BillMac | M | |
| 49 | vrk74 | M | |
| 5000 | Anna-Lisa Ott | F | |
| 5002 | Brendan Stallard | M | |
| 5005 | pinhsien | F | |
| 5007 | Kathleen Nelson | F | |
| 5009 | Michael Reuss | M | |
| 5013 | Joseph Dsouza | M | |
| 5019 | Sandra Estenson | F | |
| 5022 | Kathleen Costa | F | |
| 5023 | Elizabeth Zaranka | F | |
| 5029 | Courtney Sandhu | F | |
| 5036 | NicolaRuth | F | |
| 5038 | John Kooz | M | |
| 5039 | Inga Parsons | F | |
| 5043 | edbucks | M | |
| 5044 | Andrea Keene | F | |
| 5045 | Mounica | F | |
| 5049 | Bradley Smith | M | |
| 5054 | Denice Stradling | F | |
| 505 | Menno | M | |
| 5060 | Linda Moreau | F | |
| 5062 | E Ogston | F | |
| 5076 | Jules Hawryluk | M | |
| 5077 | Sandra G | F | |
| 5082 | SummerWind | F | |
| 5092 | Josh Smith | M | |
| 5093 | Nicole Kay | F | |
| 5101 | E.Lee | F | |
| 5104 | Chuck Burke | M | |
| 5115 | Terry Goodyer | F | |
| 5118 | klbonds | M | |
| 5123 | wvthcomp | M | |
| 5132 | David Stryker | M | |
| 5133 | Jo Karabasz | F | |
| 5136 | Felicity C | F | |
| 5141 | David Goldfarb | M | |
| 5147 | Cody2 | M | |
| 5152 | Liam Neely | M | |
| 5154 | Danarra | F | |
| 5157 | drewmac | M | |
| 5163 | LilyAnne | F | |
| 5164 | Vsilverlining | F | |
| 5172 | Equilibrium33 | M | |
| 517 | Matthew Walton | M | |
| 5181 | Joel Nisbet | M | |
| 5183 | Kenneth Sergeant Gaghan | M | |
| 5185 | okei | M | |
| 5186 | Brendan Brown | M | |
| 5189 | Samanem | M | |
| 5190 | Rom Maczka | M | |
| 5192 | Jason Esteves | M | |
| 5198 | Brian | M | |
| 5199 | Diana Fast | F | |
| 51 | rakkar | M | |
| 5217 | Anqi Wang | F | |
| 5220 | Mary Schneider | F | |
| 5224 | Matt Soar | M | |
| 5230 | Aubrey Anne | F | |
| 5233 | summerdaze | F | |
| 5239 | compozr | M | |
| 5242 | Michael Monhollon | M | |
| 5244 | Carolin Ksr | F | |
| 5245 | Dymmesdale | M | |
| 5246 | Mike Bloomfield | M | |
| 5248 | Don Stirno | M | |
| 5252 | Michael Deng | M | |
| 5261 | Ali Kazerani | M | |
| 5269 | Elizabeth Barr | F | |
| 5271 | Amanda | F | |
| 5278 | Mike Harris | M | |
| 5280 | penboy7000 | M | |
| 5285 | Sweetlilbirdy | F | |
| 5287 | adsum iam | F | |
| 5290 | Natalie | F | |
| 5293 | Ned Troxel | M | |
| 5296 | Joselyn Hasty | F | |
| 5299 | Becky Doughty | F | |
| 52 | Luisa Hall | F | |
| 5304 | Don W. Jenkins | M | |
| 5321 | Adam Whybray | M | |
| 5322 | Jay Bidal | M | |
| 5325 | Rory Lawton | M | |
| 5328 | Nathan Jordan | M | |
| 5333 | Robert Fletcher | M | |
| 5337 | Danielle | F | |
| 5339 | Lauren McCullough | F | |
| 5340 | Mary-Beth Blackburn | F | |
| 534 | Jean O'Sullivan | F | |
| 5350 | Cath Garde | F | |
| 5355 | Carrie Heyes | F | |
| 5361 | scarlettraces | F | |
| 5375 | BumbleVee | F | |
| 5379 | lennich | M | |
| 5386 | Tim Ferreira | M | |
| 5389 | Joseph Lawler | M | |
| 5390 | Charles Bice | M | |
| 5393 | Amy Hengst | F | |
| 5400 | Natalie Sullivan | F | |
| 5401 | Andrew Nelson | M | |
| 5405 | Anka | F | |
| 5412 | tommybascue | F | |
| 5424 | Julia Niedermaier | F | |
| 5429 | Dennis Lane Pretoria | M | |
| 542 | J. Hall | M | |
| 5439 | Laine S. | F | |
| 5445 | Liz DeLassus | F | |
| 544 | bozgeez | M | |
| 5456 | e_scarab | M | |
| 5459 | bryan.peterson | M | |
| 5460 | Max Lindberg | M | |
| 5463 | GLM | M | |
| 5468 | ashleighjane | F | |
| 5471 | ElleyKat | F | |
| 5480 | ESFJ Girl | F | |
| 5487 | Michaela O'Connor | F | |
| 5506 | Frank Booker | M | |
| 5513 | David Callahan | M | |
| 5514 | Ella Jane Quentin | F | |
| 551 | Guntar | M | |
| 5538 | Linda Velwest | F | |
| 5545 | Gary Olman | M | |
| 5561 | Ellen Jones | F | |
| 5565 | Ken Padgitt | M | |
| 5567 | BStapley | M | |
| 5569 | Beth Hitesman | F | |
| 557 | fieldsofgold | M | |
| 5583 | Claudia Wilson | F | |
| 55 | David Jaquay | M | |
| 5604 | kittyandcheese | F | |
| 5606 | PrincessG | F | |
| 5620 | jerryB | M | |
| 5628 | Adrian Wheal | M | |
| 5635 | Matthew Reece | M | |
| 5636 | Joyce Couch | F | |
| 5641 | Gerald Peter Morgan | M | |
| 5649 | hazelra | F | |
| 5652 | amicrazy2u | F | |
| 5653 | Kimberly Anderson | F | |
| 5660 | hollz | F | |
| 5661 | Dianne Lanning | F | |
| 5665 | Lynda Sizemore | F | |
| 5671 | Trihypoo | F | |
| 5678 | jgoffena | M | |
| 567 | Aaron Benedict | M | |
| 5682 | Lmwong | F | |
| 5684 | Elsa Youngsteadt | F | |
| 5688 | Jennifer Dionne | F | |
| 568 | JD Weber | M | |
| 569 | Frank | M | |
| 56 | Kirsten Ferreri | F | |
| 5700 | Paul Adams | M | |
| 5703 | Garth Comira | M | |
| 5717 | Phil Chenevert | M | |
| 5719 | John Fricker | M | |
| 5720 | Thelma Meyer | F | |
| 5723 | Linda Hogan | F | |
| 5724 | paintgirl | F | |
| 5725 | doublemirrors | F | |
| 5727 | JDavidMoore | M | |
| 572 | Rebecca Dittman | M | |
| 5733 | Spinhop | F | |
| 5735 | Filipa | F | |
| 5740 | Alisa | F | |
| 5746 | DL Pead | M | |
| 5750 | laurencetrask | M | |
| 5756 | Mich_elle | F | |
| 5765 | A. J. Carroll | M | |
| 5767 | taijohn | M | |
| 576 | Caroline Mercier | F | |
| 5772 | jessecoy | M | |
| 5776 | Chris Pauley | M | |
| 5778 | Laura Victoria | F | |
| 5781 | Parrot17 | M | |
| 5784 | Chris Donnelly | M | |
| 5789 | Kirsten Wever | F | |
| 5791 | croudy | M | |
| 5796 | Linette Geisel | F | |
| 57 | Ophelia Darcy | F | |
| 5802 | Christopher Maust | M | |
| 5808 | jeandelfrio | M | |
| 5809 | kattekliek | F | |
| 580 | Ryan | M | |
| 5810 | Patrick Reinhart | M | |
| 581 | C. Berrius | M | |
| 5825 | Vira Denton | F | |
| 5826 | Phineas Redux | M | |
| 5831 | Kirsty Leishman | F | |
| 5837 | Debbie Pieterse | F | |
| 583 | Russ Maxwell | M | |
| 5840 | Dick Summerfield | M | |
| 584 | miette | F | |
| 5854 | Gabriel Glenn | M | |
| 585 | pheo | F | |
| 5860 | J L Raimundo | F | |
| 5867 | Sharon Omi | F | |
| 5874 | Paul Andrews | M | |
| 5876 | kelleywyskiel | F | |
| 587 | Joy Scaglione | F | |
| 5886 | Simon Brown | M | |
| 5890 | GabrielleC | F | |
| 5893 | Elizabeth Fiedler | F | |
| 5894 | Paul Stephens | M | |
| 589 | Stephanie Konig | F | |
| 58 | George Coutts | M | |
| 5906 | Lily-LLM | F | |
| 5909 | Mark Mickelson | M | |
| 5910 | Anthony Lee | M | |
| 5911 | Paul C. Newman | M | |
| 5913 | dmbrought | M | |
| 5914 | bobbybrill | M | |
| 5929 | Gryphon Perkins | F | |
| 5933 | Barry O'Neill | M | |
| 5935 | Mike Okonek | M | |
| 593 | Eric S. Piotrowski | M | |
| 5940 | Gargoyle | M | |
| 5949 | debolee | F | |
| 594 | KentF | M | |
| 5951 | Stevan Simmons | M | |
| 5952 | sherlock85 | F | |
| 5968 | Cate Barratt | F | |
| 5970 | Larry Degala | M | |
| 5975 | Tony Maxey | M | |
| 5977 | Ken Felt | M | |
| 5979 | Pentti Hirvonen | M | |
| 597 | Lisa Chau | F | |
| 5980 | Nichole Thompson | F | |
| 5983 | Katew | F | |
| 598 | Kim | F | |
| 5993 | garyday | M | |
| 6000 | MissRose | F | |
| 6003 | sparks0314 | M | |
| 6006 | Stephanie Lee | F | |
| 6009 | AVG | M | |
| 6010 | Ralph Kerwin | M | |
| 6014 | Tina Nuzzi | F | |
| 6019 | DerekP | M | |
| 6025 | Lonelle Yoder | F | |
| 6030 | Shiromi | F | |
| 6035 | Marty Kris | M | |
| 6051 | Ric Cornwall | M | |
| 6060 | Jonathan Lange | M | |
| 6064 | Deborah Knight | F | |
| 6065 | David Olson | M | |
| 6072 | CrowGirl | F | |
| 6076 | Saethram | M | |
| 6077 | Steve Belleguelle | M | |
| 6078 | dobsonfly | F | |
| 6080 | progressingamerica | M | |
| 6081 | Lazuli | M | |
| 6084 | Amallen | M | |
| 6087 | Caroline Driggs | F | |
| 6088 | burk | F | |
| 608 | Baranduin | F | |
| 6098 | Kancamagus | M | |
| 6099 | Cheri Gardner | F | |
| 60 |CBW Simon | M | |
| 6102 | Rachel Bossier | F | |
| 6106 | Ruth Kidson | F | |
| 6111 | Jill Preston | F | |
| 6119 | Vinnie Tesla | M | |
| 6120 | Terra Mendoza | F | |
| 6121 | Imagine | F | |
| 6126 | David Abbott | M | |
| 6127 | Andee | F | |
| 6131 | Malane | F | |
| 6135 | Spike Holcomb | F | |
| 6138 | Deborah Brabyn | F | |
| 6139 | Lois C. Johnson | F | |
| 613 | D.E. Wittkower | M | |
| 6145 | Madeleine Brook | F | |
| 6147 | Liberty Stump | F | |
| 614 | Christine Blachford | F | |
| 6153 | anjieliu | F | |
| 6159 | Ted Garvin | M | |
| 6173 | Carol Box | F | |
| 6177 | wminbru | M | |
| 6178 | alegriavida | F | |
| 6181 | Mike | M | |
| 6184 | Adam Tomkins | M | |
| 6188 | Roxanna Nazari | F | |
| 6196 | Martin Gradwell | M | |
| 6199 | bobolink | M | |
| 6209 | deckerteach | M | |
| 6211 | Caeliveres | F | |
| 6221 | pwu909 | M | |
| 6224 | dave k | M | |
| 6227 | EliMarieHK | F | |
| 622 | Andrew Lebrun | M | |
| 6232 | Paul Denton | M | |
| 6233 | Gen Jones | F | |
| 6235 | ReadWriteLib | F | |
| 6242 | Lucinda Gainey | F | |
| 6248 | Kevin Green | M | |
| 6249 | Thomas A. Copeland | M | |
| 6251 | Theresa Sheridan | F | |
| 6254 | Chelsea S. | F | |
| 625 | toriasuncle | M | |
| 6272 | jlenardon | F | |
| 6276 | dan_h | M | |
| 6281 | Beth Thomas | F | |
| 6284 | cklee | F | |
| 6286 | Wendy Almeida | F | |
| 6288 | Sunni West | F | |
| 6294 | humanode | M | |
| 62 | Faris | M | |
| 6300 | Sarah Crampton | F | |
| 6308 | Easton | F | |
| 6311 | TRUEBRIT | M | |
| 6317 | Sarah K | F | |
| 6323 | Caluminium | M | |
| 6324 | Barbara E. McCarthy | F | |
| 6330 | David Cummings | M | |
| 6332 | Kelli England | F | |
| 6333 | Max Korlinge | M | |
| 6339 | Michelle Remington | F | |
| 6346 | Matthew Pagan | M | |
| 6351 | C. L. W. Rollins | F | |
| 6352 | stmacduff | F | |
| 6353 | Jennifer Randall | F | |
| 6356 | John O | M | |
| 6358 | selway | F | |
| 6364 | Todd Ulbrich | M | |
| 6367 | Vince Dee | M | |
| 6368 | Marc Pizzuti | M | |
| 636 | Zale Schafer (Rose May Chamberlin Memorial Foundat | F | |
| 6370 | Dan Craig | M | |
| 6377 | Maxim Babich | M | |
| 6378 | Michelle Day | F | |
| 637 | Michael Scherer | M | |
| 6385 | Novella Serena | F | |
| 6391 | polkadotish | F | |
| 6395 | Richard Carpenter | M | |
| 6399 | Edmund Bloxam | M | |
| 639 | Robert Beach | M | |
| 6402 | Chiquito Crasto | M | |
| 6406 | Abigail Rasmussen | F | |
| 6407 | AdamH | M | |
| 6411 | Feyaza | F | |
| 6415 | Daryl Wor | F | |
| 6418 | Iolo Jones | M | |
| 6436 | Steve Mattingly | M | |
| 6437 | John Hoerr | M | |
| 6446 | Bob Gonzalez | M | |
| 644 | Daniele | M | |
| 6454 | David Wales | M | |
| 6458 | Dennis Blake | M | |
| 6459 | Nigel Boydell | M | |
| 6476 | Viridian | F | |
| 6482 | Delmar H Dolbier | M | |
| 6484 | ilianthe | F | |
| 6488 | Kendall Ashyby | F | |
| 6492 | Hugh Gillis | M | |
| 6494 | Morey Kunin | M | |
| 6499 | dave7 | M | |
| 64 | Robin Cotter | F | |
| 6505 | Elena | F | |
| 6506 | Tim Quinn | M | |
| 6512 | mcgovern1934 | M | |
| 6513 | Susan de Raadt | F | |
| 6529 | Fred DeBerardinis | M | |
| 6531 | janesandberg | F | |
| 6533 | drewmore | M | |
| 6534 | Helen Falconer | F | |
| 6535 | Ron Altman | M | |
| 6538 | Juan Federico | M | |
| 6539 | David W. Wolfe | M | |
| 6540 | Craig Gulliver | M | |
| 6548 | Kristin Gjerlw | F | |
| 6549 | Sandra Luna | F | |
| 6550 | elfpen | M | |
| 6553 | DublinGothic | M | |
| 6557 | Tika Sabu | F | |
| 6563 | William Tomcho | M | |
| 6567 | vikvenom | F | |
| 6568 | Heather Hamtil | F | |
| 6574 | Caden Vaughn Clegg | M | |
| 6575 | Patrick Painter | M | |
| 6583 | NastassiaS | F | |
| 6590 | Marea Brook | F | |
| 6594 | Amelia Chantarotwong | F | |
| 65 | chriss the girl | F | |
| 6609 | Patrick Wallace | M | |
| 6610 | sylly | F | |
| 6614 | Veronica Schlette | F | |
| 6620 | Amy Koenig | F | |
| 6625 | hearmeout7 | M | |
| 6627 | Amber Hamilton | F | |
| 6636 | Philip Martin | M | |
| 6637 | Christine Nendza | F | |
| 663 | Bruce Stafford | M | |
| 6643 | cbooren | F | |
| 664 | Wendy G. | F | |
| 6652 | Brendon Wright | M | |
| 6660 | Nicole Lee | F | |
| 6668 | Ecological Humanist | M | |
| 6673 | Jenna Lanman | F | |
| 6674 | jimmylee | M | |
| 6676 | Chill28 | F | |
| 667 | Bethany Simpson | F | |
| 6685 | Jonathan Drury | M | |
| 6686 | Elin | M | |
| 6687 | KirksVoice | M | |
| 6689 | Tiffany Halla Colonna | F | |
| 6690 | T Michael Burke | M | |
| 6694 | Ross Williamson | M | |
| 6695 | Linda Fredericks | F | |
| 669 | Anne | F | |
| 66 | Alex Foster | M | |
| 6701 | Dayle | M | |
| 6705 | D. A. Frank | F | |
| 6707 | Lewis | M | |
| 6709 | vinphizz | M | |
| 6713 | stephenreader | M | |
| 6724 | Kristin Young | F | |
| 6726 | metgmz | F | |
| 6727 | Tony Russell | M | |
| 6733 | Snapdragon | F | |
| 6735 | fshort | F | |
| 6741 | Sharon C. | F | |
| 6743 | Rick Rodney | M | |
| 6746 | Robin Skelcey | M | |
| 6747 | Ryan Lothian | M | |
| 6749 | MaryA | F | |
| 6752 | maxvon_d | M | |
| 6753 | T.E. McHenry | M | |
| 6754 | ToddHW | M | |
| 6758 | The Gypsy | F | |
| 6773 | MostafaRazavi | M | |
| 6777 | Rick Saffery | M | |
| 6784 | SteveBuys | M | |
| 6788 | Pamela Krantz | F | |
| 6792 | montmorency | M | |
| 6794 | Rachel Moyar | F | |
| 6798 | Aesthete's Readings | M | |
| 679 | rhodian | M | |
| 6804 | Nick Duncan | M | |
| 6807 | Lisa Caputo | F | |
| 6818 | beckyboyd | F | |
| 681 | Lucy Burgoyne | F | |
| 6821 | Rholdah | F | |
| 6836 | John | M | |
| 6846 | John Leonard | M | |
| 6848 | KarlHenning | M | |
| 6849 | Dan Raynham | M | |
| 684 | Lizzie Driver | F | |
| 6853 | J. McKnight | F | |
| 6865 | Jing Li | F | |
| 6875 | Bill Miller | M | |
| 6877 | Bear Schacht | M | |
| 6880 | Capybara | M | |
| 6882 | David Isenhower | M | |
| 6883 | Adam Doughty | M | |
| 6892 | Piotr Nater | M | |
| 6895 | Reeses118 | F | |
| 6902 | Barbara Edelman | F | |
| 6906 | Joanna1 | F | |
| 690 | Silver | F | |
| 6912 | Richard Beck | M | |
| 6913 | daisyb | F | |
| 6914 | Katalina Watt | F | |
| 6918 | Marilyn Mack | F | |
| 6923 | Szindbad | M | |
| 6924 | Rapunzelina | F | |
| 6925 | Thomas Meaney | M | |
| 6927 | Sarika Pawar | F | |
| 6943 | Chieko Steely | F | |
| 6945 | Daniel George | M | |
| 6947 | Grace | F | |
| 6950 | elmay | F | |
| 6951 | redhed3095 | F | |
| 6954 | Paul Richards | M | |
| 6962 | mattoscarlomas | M | |
| 6963 | Kasper | M | |
| 6965 | NoelBadrian | M | |
| 6967 | sganatra81 | F | |
| 696 | Tamara R. Schwartz | F | |
| 6974 | Michael Armenta | M | |
| 6978 | Debra | F | |
| 7000 | Kevin Alix | M | |
| 7001 | Arienne | F | |
| 7008 | John Trevithick | M | |
| 7009 | roeg11 | M | |
| 7011 | Icprice | M | |
| 7012 | Erin McKelle | F | |
| 7026 | Michele Eaton | F | |
| 7030 | Conrad T | M | |
| 7046 | Pascal Ramseier | M | |
| 7051 | Andrew White | M | |
| 7055 | gemtwist | M | |
| 7059 | Joannemmp | F | |
| 705 | eva | F | |
| 7061 | AllenJohns | M | |
| 7062 | Rebecca Thomas | F | |
| 7065 | smitaj | M | |
| 7067 | Matthew Wall | M | |
| 7069 | John Schuurman | M | |
| 7073 | Jill Janovetz | F | |
| 7078 | Mary in Arkansas | F | |
| 7079 | Chuck Williamson | F | |
| 708 | Kevin Devine | M | |
| 7090 | Jon Sindell | M | |
| 7092 | Lorraine B | F | |
| 7095 | Wesseling | M | |
| 7096 | Gary Iredale | M | |
| 7097 | novelreader | F | |
| 70 | Kurt Copeland | M | |
| 7107 | titankin77 | M | |
| 7113 | Sukaina Jaffer | F | |
| 7117 | Art Leung | F | |
| 711 | Roy Schreiber | M | |
| 7121 | 384403 | M | |
| 7125 | Peggy | F | |
| 7128 | morganreads | M | |
| 712 | Michael Shook | M | |
| 7131 | Eden Rea-Hedrick | F | |
| 7134 | Steve Jackson | M | |
| 7135 | Maggie Smallwood | F | |
| 7138 | CaprishaPage | F | |
| 7139 | gabrielv | M | |
| 713 | Onjana Yawnghwe | F | |
| 7143 | Minni Ang | F | |
| 7147 | S.Nevets | M | |
| 7148 | Vickie Ranz | F | |
| 7150 | asterix | M | |
| 7155 | pklipp | M | |
| 7169 | Ryan Ransom | M | |
| 716 | martyd | M | |
| 7170 | alanmapstone | M | |
| 7177 | shana | F | |
| 7178 | J.K. Neely | F | |
| 7188 | Marty | M | |
| 7189 | doonaboon | M | |
| 718 | clarknova | M | |
| 7190 | Tony Posante | M | |
| 7197 | Christine Richardson | F | |
| 7198 | Daniela Austin | F | |
| 7199 | T.K. Kirven | F | |
| 7205 | genierose | F | |
| 7208 | KK | M | |
| 720 | Peter Gallagher | M | |
| 7215 | BensonBrunswin | M | |
| 7218 | MJ Franck | F | |
| 7220 | LynnAlison | F | |
| 7223 | eye hear voices | F | |
| 7226 | Jonathan Moore | M | |
| 7228 | Peter John Keeble | M | |
| 7229 | Linda Ciano | F | |
| 7238 | Uday Sagar | M | |
| 7239 | manofwealth | M | |
| 7240 | Lucretia B. | F | |
| 7242 | Renate | F | |
| 7245 | Laura Atkinson | F | |
| 7246 | Lyn Silva | F | |
| 7247 | Robert Hoffman | M | |
| 7250 | A. J. Elliot | F | |
| 7255 | Jendia | F | |
| 7263 | rachaelg | F | |
| 7264 | Sean McClain | M | |
| 7265 | Annie | F | |
| 726 | Paul | M | |
| 7277 | Jenny Bradshaw | F | |
| 7278 | Jon Smith | M | |
| 727 | Andrew Richards | M | |
| 7285 | Christina M. Glavas | F | |
| 7286 | kindfish | F | |
| 728 | Eric Connover | M | |
| 7299 | Barbara Miller | F | |
| 7301 | jonseverity | M | |
| 7302 | Asta1234 | F | |
| 7307 | Anthony Ogus | M | |
| 730 | Karen Labenz | F | |
| 7312 | nkneer | M | |
| 7313 | Mark DeVol | M | |
| 7315 | Charlotte Duckett | F | |
| 731 | Megan-Jane Daniels Suyasu | F | |
| 7320 | Monika Rolley | F | |
| 7326 | Adam | M | |
| 7327 | Tommy Howell | M | |
| 7331 | AnabelleC | F | |
| 7333 | Lydia Paterson | F | |
| 7337 | Adina Owen | F | |
| 7338 | Eberle Thomas | M | |
| 7342 | Carol | F | |
| 7346 | James Bendall | M | |
| 7348 | acousticwave | F | |
| 7354 | TrevorD777 | M | |
| 7357 | rebcult | M | |
| 7360 | Caroline Hemmerly Kunkle | F | |
| 7367 | NIneFive83 | M | |
| 7376 | Nyssa E. Schmidt | F | |
| 737 | Roger W. Barnett | M | |
| 7383 | Meg Cowan | F | |
| 7387 | Tara Dow | F | |
| 7389 | Steve C | M | |
| 7391 | Cary Simz | M | |
| 7392 | MicheleW | F | |
| 7395 | Katherine | F | |
| 7398 | Marie Daum | F | |
| 7402 | Canby Ibarra | M | |
| 7408 | David Clarke | M | |
| 7416 | Jeanni Hall | F | |
| 7423 | Gilles G. Le Blanc | M | |
| 7424 | Christopher Smith | M | |
| 742 | Peter Groom | M | |
| 7433 | Gabriela Cowan | F | |
| 7436 | Gregory Eccles | M | |
| 7445 | Emily Anderson | F | |
| 7447 | dasbury | M | |
| 7448 | Kevin Johnson | M | |
| 7460 | Larry Beasley | M | |
| 7463 | Pete Milan | M | |
| 7467 | freshface | F | |
| 7475 | Jared Hess | M | |
| 7478 | Dan Froese | M | |
| 7480 | Tricia F. | F | |
| 7491 | Lilaread | F | |
| 7492 | Scheherazade | F | |
| 7495 | Arlene Joyce | F | |
| 7498 | MarianneVictoria | F | |
| 7502 | mikefernlea | M | |
| 7505 | Ron Lockhart | M | |
| 7507 | UnaVersal | F | |
| 7510 | Kathrine Engan | F | |
| 7511 | Sherri Vance | F | |
| 7512 | dudeman | M | |
| 7514 | Barbara Baker | F | |
| 7515 | Cynthia Moyer | F | |
| 7517 | Raz Mason | F | |
| 7518 | TJDasch | M | |
| 7520 | Richard Jackson | M | |
| 7522 | Kelsey P | F | |
| 7525 | Jeannie Tirado | F | |
| 7538 | Logan West | M | |
| 753 | Tim Bulkeley | M | |
| 7540 | Christopher Webber | M | |
| 7552 | KateC | F | |
| 7553 | BDSEmpire | M | |
| 7555 | Suebee | F | |
| 7556 | Alex Lau | M | |
| 7558 | J. A. Cook | M | |
| 7559 | gassumpcao | M | |
| 7561 | Shawn Bayern | M | |
| 7565 | Derek | M | |
| 7584 | kandice stehlik | F | |
| 7585 | MaxSitting | M | |
| 7594 | Kristel Tretter | F | |
| 7597 | Inah Derby | F | |
| 75 | Jim Mowatt | M | |
| 7603 | Wupperhippo | M | |
| 7607 | C F de Rosset | F | |
| 7608 | rookieblue | M | |
| 7609 | detroitreads | F | |
| 7618 | Stipsky | M | |
| 7635 | Judy Guinan | F | |
| 7640 | Dan Darbandi | M | |
| 7644 | Raphael Platt | F | |
| 7647 | Daniel T. Miller | M | |
| 7649 | Lanerd | F | |
| 7654 | Word And Mouth | M | |
| 7657 | shalclark | F | |
| 766 | Jean Crevier | M | |
| 7672 | Cooper Leith | M | |
| 7679 | Libby Gohn | F | |
| 7683 | Carolyne | F | |
| 7687 | Demosthenes | F | |
| 7691 | engineerdst | M | |
| 7699 | DylanTG | F | |
| 7700 | Dave Wills | M | |
| 7702 | Linda Jenner | F | |
| 7704 | Robert Harder | M | |
| 7708 | Savannah | F | |
| 770 | Justin S Barrett | M | |
| 7713 | Sacha Chander | M | |
| 7717 | Astrid Fingerhut | F | |
| 7720 | jeffwiltzius | M | |
| 7733 | Jewel Raquel | F | |
| 7737 | Elisabeth Sollog | F | |
| 7739 | Melissa Burns-Price | F | |
| 7746 | Tom Causby | M | |
| 7749 | Sammy Bean | M | |
| 774 | Sara Walsh | F | |
| 7752 | Samantha Miles | F | |
| 7756 | Lynne Thompson | F | |
| 7762 | Fannie | F | |
| 7764 | Mike Nelson | M | |
| 7766 | Maryanka | F | |
| 7769 | David Biro | M | |
| 7777 | Jacob Paine | M | |
| 7780 | tazzle | F | |
| 7786 | Kevin W. Davidson | M | |
| 7789 | Lauren Jane | F | |
| 778 | Branko Collin | M | |
| 7794 | mlcui | F | |
| 7795 | Cubrick | M | |
| 7796 | Raybrite | M | |
| 779 | Greg | M | |
| 77 | JemmaBlythe | F | |
| 7800 | Arie | F | |
| 7802 | Samantha J Gubitz | F | |
| 780 | Lloyd Davis | M | |
| 7816 | Stefanie Heinrichs | F | |
| 781 | Mitchell Dwyer | M | |
| 7823 | Bart in 't Veld | M | |
| 7825 | PDyer | M | |
| 7826 | Dave Shaw | M | |
| 7828 | Dan Mason | M | |
| 782 | Michele Pacey | F | |
| 7833 | Jesse Crisp-Sears | M | |
| 7835 | kageokami | M | |
| 7839 | Loveday | F | |
| 783 | Gina | F | |
| 7843 | Annette McGuinness | F | |
| 7848 | bala | M | |
| 7859 | xinamarieuhl | F | |
| 7871 | Rocit | M | |
| 7879 | deongines | F | |
| 7883 | Annapurna | F | |
| 7886 | Mariah Lyons | F | |
| 7892 | Alexis Castro | F | |
| 7898 | Coreena | F | |
| 789 | Eva | F | |
| 78 | Hugh McGuire | M | |
| 7909 | MGreenberg | M | |
| 7912 | Nathan Dickey | M | |
| 791 | Ivan | M | |
| 7923 | amaskill | M | |
| 7925 | Etel Buss | F | |
| 792 | mjd-s | F | |
| 7932 | Tammy Stalcup | F | |
| 7938 | Goss45 | M | |
| 7939 | DPranitis | M | |
| 7942 | Luke Sartor | M | |
| 7945 | Lois Browne | F | |
| 7946 | Flash | F | |
| 7949 | Jon Miller | M | |
| 7957 | Wiley Combs | M | |
| 7959 | Lily Took | F | |
| 7962 | Jolie O'Dell | F | |
| 7967 | Lois Hill | F | |
| 797 | Mike Shapiro | M | |
| 7981 | timothyFR | M | |
| 7988 | JaySands | M | |
| 7997 | Tom Merritt | M | |
| 8005 | Julia Wells | F | |
| 8006 | TyroneS | M | |
| 8008 | Paul Adamson | M | |
| 8009 | Frances Brown | F | |
| 8012 | WoollyBee | F | |
| 8014 | constatine | F | |
| 8015 | Underhill | F | |
| 8023 | JamesMcAndrew | M | |
| 8033 | geoffbl | M | |
| 803 | Greg Elmensdorp | M | |
| 8040 | NatalieOram | F | |
| 8042 | Jack Watson Warr | M | |
| 8044 | Sarah Hannah | F | |
| 8057 | Linda Dougherty | F | |
| 8058 | RLC | M | |
| 8063 | Robert Snoza | M | |
| 8066 | Tim Cote | M | |
| 8071 | Vanessa Garcia | F | |
| 8072 | Kimberly Krause | F | |
| 8075 | Melora | F | |
| 807 | Luke Venediger | M | |
| 8080 | e.a.zokaites | F | |
| 8087 | Arnie Horton | M | |
| 8088 | Jason Bolestridge | M | |
| 8095 | Theodulf | M | |
| 8097 | lewildesen | F | |
| 8098 | Arnold | M | |
| 8108 | drakaunus | M | |
| 810 | Joseph Loverti | M | |
| 8112 | Christine Lamberton | F | |
| 8118 | Katie McClain | F | |
| 8119 | Malcolm Cameron | M | |
| 811 | Elizabeth | F | |
| 8123 | Sheila Wood | F | |
| 8138 | Lee Smalley | M | |
| 8143 | Nick Whitley | M | |
| 8148 | Xiph | F | |
| 8152 | Bigcowfeet | M | |
| 8156 | Brooke Cunningham | F | |
| 815 | mawrtea | M | |
| 8163 | Greengecko | F | |
| 8164 | Rob Board | M | |
| 8168 | Kiera Davidson | F | |
| 8169 | tovarisch | M | |
| 816 | Jeff Robinson | M | |
| 8172 | Alan Weyman | M | |
| 8176 | Jon Kerfoot | M | |
| 8180 | Elanor Sakamoto | F | |
| 8183 | Cheri Jordan | F | |
| 8190 | Lisa Phelps Gonzalez | F | |
| 8193 | helengraves | F | |
| 8194 | MsMO | F | |
| 8195 | Mr Krause | M | |
| 8197 | Victoria P | F | |
| 8199 | maryagneskatherine | F | |
| 81 | Aaron Decker | M | |
| 8200 | Dan S | M | |
| 8208 | zaanta | M | |
| 820 | Scoot | M | |
| 8215 | readread | M | |
| 8222 | Greg Golding | M | |
| 8225 | Matt Lusher | M | |
| 8226 | Adam Picot | M | |
| 8228 | hgal2010 | F | |
| 8238 | Madam Fickle | F | |
| 8240 | Gertrude Durette | F | |
| 8242 | Anita Slusser | F | |
| 8245 | gscheids | M | |
| 8246 | beeveeo | M | |
| 8250 | Stephen Gibbons | M | |
| 8259 | Lawrence | F | |
| 8262 | Jack Powell | M | |
| 8266 | Jeff K. | M | |
| 826 | Thomas Wells | M | |
| 8272 | Haili | F | |
| 8273 | Lucas Boulding | M | |
| 8291 | Elliot Gage | M | |
| 8295 | Susan Morin | F | |
| 8296 | Bria Snow | F | |
| 829 | frenchfry | F | |
| 82 | Marlo Dianne | F | |
| 8300 | Judith Parker | F | |
| 8302 | Charlotte Day | F | |
| 8307 | Nick Bulka | M | |
| 830 | sebrazer | F | |
| 8312 | Jaimie Noy | F | |
| 8316 | Rocket Rodger | M | |
| 831 | Nick Gallant | M | |
| 8321 | SamR | F | |
| 8322 | yeknod | M | |
| 8324 | Kathy Wright | F | |
| 8328 | William Gavula | M | |
| 8329 | Betty Perry | F | |
| 8334 | Doug Reed | M | |
| 8337 | Claudia Salto | F | |
| 8346 | Al Rocca | M | |
| 8347 | Terry Torres | M | |
| 8356 | Paul Mazumdar | M | |
| 8367 | ophiuroidea | M | |
| 836 | Kevin LaVergne | M | |
| 8382 | Claire Schreuder | F | |
| 8388 | Jacki Horn | F | |
| 8389 | Steven Bateman | M | |
| 8392 | Katharina Huang | F | |
| 8394 | Matthew Walker | M | |
| 8396 | gloriousjob | M | |
| 839 | rovert405 | M | |
| 83 | Catharine Eastman | F | |
| 8401 | Alexander Hatton | M | |
| 8410 | Shauna Kennett | F | |
| 8413 | PaulMichael1084 | M | |
| 8414 | jtueller | F | |
| 8415 | Rusty Dancer | F | |
| 8419 | Jon Kissack | M | |
| 8421 | Jackie Drown | F | |
| 8422 | pjhoury | M | |
| 8424 | Schums | F | |
| 8425 | Larry Wilson | M | |
| 8430 | shihping | F | |
| 8432 | Emma Joyce | F | |
| 8441 | ryoko | F | |
| 8443 | Marsha Payne | F | |
| 8444 | Anthony Webster | M | |
| 8445 | Brett G. Hirsch | M | |
| 8447 | Anastasiia Solokha | F | |
| 844 | Martina | F | |
| 8459 | sdaeley17 | M | |
| 845 | DaveF | M | |
| 8465 | TinaNygard2 | F | |
| 8466 | Chris Cartwright | M | |
| 8468 | Jennifer Dorr | F | |
| 846 | Anadaxis_Canejia | M | |
| 8470 | Rebecca Braunert-Plunkett | F | |
| 8474 | Scott Snowman | M | |
| 8476 | Julie Mansius | F | |
| 8490 | Matt Parker | M | |
| 8494 | Bill Yallalee | M | |
| 8498 | Ian Quinlan | M | |
| 8499 | ReadAllDay | M | |
| 8500 | Ravi Shankar | M | |
| 8506 | Denise Nordell | F | |
| 850 | tonypettit | M | |
| 851 | brenthumphries | M | |
| 8527 | Gary Bohannon | M | |
| 8531 | imenadel | M | |
| 8534 | Chris Clark | M | |
| 8536 | Jonathan Brubaker | M | |
| 8543 | luckyemma | F | |
| 8544 | Pooja DSr | F | |
| 8545 | Joanne Rochon | F | |
| 8565 | Patrick Eaton | M | |
| 8573 | Paige G | F | |
| 8575 | Jeremy Robertson | M | |
| 8576 | Phil Schempf | M | |
| 8580 | Gary Dana | M | |
| 8587 | Drew Johnson | M | |
| 8590 | bobrose | M | |
| 8591 | Jude Somers | F | |
| 8592 | Dylan Posa | M | |
| 85 | David Leaman | M | |
| 8609 | noblesavage | M | |
| 8625 | Ellen Preckel | F | |
| 8629 | Shivansh Dhar | M | |
| 8630 | Eduardo | M | |
| 8631 | Edward Kirkby | M | |
| 8632 | Geremia | M | |
| 8635 | ACBowgus | M | |
| 8644 | Eenae | F | |
| 8664 | Pam Castille | F | |
| 8666 | josembi | M | |
| 8671 | Simon Smoke | M | |
| 8675 | Larry Greene | M | |
| 8677 | KHand | F | |
| 8678 | Amy | F | |
| 8684 | Alison Stewart | F | |
| 8687 | EccentricOwl | M | |
| 868 | Mike Rosenlof | M | |
| 8699 | Jessica Atha | F | |
| 8705 | dsilber01 | M | |
| 8710 | Ralph Crown | M | |
| 8713 | Expatriate | M | |
| 8722 | Emily Maynard | F | |
| 8725 | Gary Ericson | M | |
| 8742 | Adam Taylor | M | |
| 8747 | DeanOBuchanan | M | |
| 8753 | Walt Allan | M | |
| 8758 | Krzysztof Rowinski | M | |
| 8765 | jciesielski | M | |
| 876 | Alisha | F | |
| 8770 | Paul Simonin | M | |
| 8772 | Martin Reyto | M | |
| 8776 | Taliesin | F | |
| 8778 | Francoise | F | |
| 8786 | Bruce Kachuk | M | |
| 8791 | ScottReyonoldsVoice | M | |
| 8797 | Sean Grabosky | M | |
| 8799 | Peter Tucker | M | |
| 87 | Rosalind Wills | F | |
| 8803 | Ben Lindsey-Clark | M | |
| 8808 | davidpr | M | |
| 8820 | Ignare | M | |
| 8825 | Erin Schellhase | F | |
| 882 | Mur Lafferty | F | |
| 8838 | Kevin Owens | M | |
| 8846 | MariaS | F | |
| 8848 | Craig Kenneth Bryant | M | |
| 884 | sayeth | M | |
| 8855 | Eric Metzler | M | |
| 8867 | sorbet87 | F | |
| 886 | Paul S. Jenkins | M | |
| 8875 | David D'Huet | M | |
| 887 | Lana Taylor | F | |
| 8887 | Andrew Hernandez | M | |
| 8897 | beyondutopia | F | |
| 895 | Max Porter Zasada | M | |
| 8975 | Daisy Flaim | F | |
| 89 | Kristen McQuillin | F | |
| 9000 | Ramon Escamilla | M | |
| 9022 | Claire M | F | |
| 909 | Greg Bryant | M | |
| 90 | Dan Threetrees | M | |
| 911 | frankjf | M | |
| 915 | Ted Kaouk | M | |
| 91 | Stephan Mobius | M | |
| 921 | Brian J. Callaghan | M | |
| 922 | Steven H. Wilson | M | |
| 923 | Layna | F | |
| 925 | pattymarie | F | |
| 927 | Nerijus | M | |
| 937 | Susie G. | F | |
| 93 | Kathy | F | |
| 949 | ontheroad | M | |
| 94 | David Barnes | M | |
| 951 | thomasina | F | |
| 956 | krithiga | F | |
| 957 | iscatel | M | |
| 960 | Marloes Schoonheim | F | |
| 964 | Paul Sze | M | |
| 969 | Czechchris | M | |
| 976 | Alison Raouf | F | |
| 978 | Rick Box | M | |
| 979 | Kelli Robinson | F | |
| 982 | Mike Roop | M | |
| 984 | J A Carter | M | |
| 985 | George Pilling | M | |
| 986 | Michael Kirkpatrick | M | |
| 98 | Patricia Oakley | F | |
================================================
FILE: data/youdao/text/emotion
================================================
普通
生气
开心
惊讶
悲伤
厌恶
恐惧
================================================
FILE: data/youdao/text/energy
================================================
音量普通
音量很高
音量很低
================================================
FILE: data/youdao/text/pitch
================================================
音调普通
音调很高
音调很低
================================================
FILE: data/youdao/text/speaker2
================================================
8051
11614
9017
6097
6671
6670
9136
11697
92
12787
1006
1012
1018
101
1025
1027
1028
102
1034
103
1040
1046
1049
104
1050
1051
1052
1058
1061
1065
1066
1069
1079
107
1081
1084
1085
1088
1092
1093
1094
1096
1097
1098
1107
110
1110
1112
1116
111
1121
1124
112
1132
1152
1154
1160
1161
1165
1166
1168
1171
1175
1179
1182
1183
1184
1187
118
1195
119
1200
1222
1224
1225
1226
122
1230
1235
1239
123
1246
1250
1252
1258
1259
125
1260
1261
1263
1265
1266
126
1271
1274
127
1280
1283
128
1291
1296
1298
1311
1313
1323
1331
1334
1335
1336
133
1341
1342
1343
1347
1349
1353
1355
1363
1365
1367
1370
1373
1374
1379
1384
1387
1392
1403
1414
1417
1421
1422
1425
1430
1444
1445
1447
1448
1455
1460
1463
1469
1474
147
1485
1487
1492
1494
1495
1498
1502
1505
1509
150
1513
151
152
1535
1536
153
1544
1545
1547
154
1552
1553
1556
1559
1563
1564
1566
1569
1571
1572
1578
1579
1593
1594
1595
159
1601
1603
1607
1614
1618
161
1621
1624
1633
1636
1639
163
1641
1643
1645
1646
1647
1648
1653
1664
1665
1668
1674
1679
167
1680
1681
1685
168
1690
1691
1693
1695
1696
1699
16
1704
1705
1708
1710
1714
1717
1721
1726
1731
1733
1736
1737
173
1743
1746
1748
1750
1754
1756
1757
175
1760
1765
1767
1769
176
1772
1773
1777
1779
177
1780
1784
1789
1795
1801
1804
1809
1811
1813
1815
1819
1825
1826
1828
1841
1844
1846
1849
1851
1859
1863
1867
1868
1870
1874
1878
1885
188
1898
1901
1903
1913
1920
1923
1924
1926
1931
1938
1943
1944
1963
1968
196
1970
1974
1977
1985
1987
1989
198
1992
199
19
2001
2002
2003
2004
2007
200
2010
2012
2013
201
2021
2026
202
2039
203
2042
2046
204
2050
2051
205
2060
2061
2062
2063
2067
2068
207
2089
208
2090
2092
2096
209
20
2100
2104
210
2110
2113
211
2122
2127
2133
2136
2140
2143
2148
2149
2152
2156
2159
215
2167
2182
2185
218
2194
2195
2196
2198
2208
2229
2230
2234
2237
2238
2240
2246
224
2254
2256
225
2262
2269
226
2270
2272
2273
2275
2276
2279
227
2284
2288
2289
228
2292
2294
2297
2299
229
2301
2309
2312
2319
231
2339
233
2341
2346
2351
2356
2361
2364
2368
2374
2380
2384
238
2391
2393
2397
2401
2404
2405
2407
240
2416
242
2436
2437
243
2445
2448
245
2485
2487
2488
248
2491
2494
2496
2498
2499
249
2504
250
2512
2514
2517
2518
2522
2526
252
2531
253
2541
2544
2545
254
2552
2553
255
2568
2570
2573
2574
2577
2587
2588
2589
258
2598
25
2606
2607
2624
2628
2638
263
264
2652
2654
265
2660
2671
2673
2674
2676
2691
2694
26
2712
2724
272
2730
2733
2735
273
2740
2741
2748
274
2754
2762
2764
2769
2775
277
2785
2787
278
27
2812
2817
2825
2827
2834
2836
283
2843
2853
2854
2882
2893
2895
289
28
2909
2910
2911
2919
2920
2925
2930
2943
2946
294
2952
2960
2967
2971
2975
2979
2985
2988
2989
298
2990
2992
2997
2998
2999
29
3003
3006
3008
3020
3021
3025
302
3033
303
3045
3046
3053
3054
3060
3063
3079
307
3082
3088
3090
3094
3097
3098
30
3100
3105
3109
310
3112
3114
3118
3119
311
3125
3132
3135
3137
3138
313
3142
3143
3144
3148
3157
3168
3172
3179
317
3180
3192
3196
319
31
3214
3215
3224
3227
322
3230
3235
3238
3240
3242
3244
3245
3257
3258
3259
3261
3268
3271
3272
3274
3285
3288
3289
3290
32
3307
3314
3318
3319
331
332
3334
3340
3346
3356
3357
335
3361
336
3370
3373
3374
3379
337
3380
3381
3389
3394
3400
3409
340
3411
3417
3433
3436
3440
3446
3448
345
3465
3467
3470
3479
3482
3486
3488
348
3490
3500
3503
3513
3521
3526
3537
353
3541
3546
3547
3551
3553
3554
3557
3559
3564
3567
3571
3584
3587
3588
3592
3595
3598
3606
3607
3618
362
3630
3638
3641
3645
3647
3650
3654
3656
3657
365
3664
3665
366
3675
3679
3681
3691
3698
3699
369
36
3703
3723
3728
3733
3738
373
3744
3747
374
3757
3779
377
3780
3781
3783
3793
3796
3798
37
3807
380
3819
3830
3835
3843
3845
3848
3851
3852
3857
3864
3866
3867
3869
3871
3876
3879
3885
3894
3895
3896
38
3905
3906
3909
3911
3912
3922
3923
3925
3926
3928
392
3934
3945
3947
3955
3959
3962
3969
3972
3977
3979
3982
3983
398
3990
3992
3994
39
4005
4009
4010
4013
4014
4015
4017
4018
4019
4020
4021
402
4034
4039
403
4042
4044
404
4051
4054
4057
4059
405
4063
4064
4071
4078
4085
4088
408
4090
4098
409
40
4104
4108
4110
4111
4122
412
4137
4138
413
4145
4152
4156
4160
4161
4172
4174
4179
4189
4191
4192
4193
4195
4196
4205
4211
4214
4216
4217
4218
421
4225
4234
4235
4238
4243
4257
4262
4263
4267
426
4273
4277
4280
428
4295
4297
4305
4310
4313
4321
4327
432
4331
4335
4340
4344
4345
4352
4356
4362
4363
4379
4381
4396
4397
439
4402
4406
4407
4411
4415
4420
4422
4423
4427
4428
4433
4434
4441
4442
4443
4447
444
4455
4463
446
4474
4480
4481
4484
4487
448
4490
4492
4495
44
4511
4513
4519
451
4520
4535
453
4545
4546
4549
454
4563
4576
4583
4586
458
4591
4592
4594
4598
4599
459
45
460
4640
4652
4659
4660
4667
466
4680
4681
4687
4693
4697
4699
46
4701
4703
4705
4706
470
4710
4712
4719
472
4731
4738
4741
4742
4744
4748
474
4750
4757
475
4766
4767
476
4771
4773
4779
4788
4791
4799
479
47
4800
4806
480
4813
481
4821
4824
4830
4836
4837
483
4841
4846
4848
4853
4854
4859
4860
4863
4872
4894
4898
4899
489
4910
4915
4926
4930
4931
4936
4948
4955
4958
4959
4964
4965
4969
4973
4979
497
4991
4993
49
5000
5002
5005
5007
5009
5013
5019
5022
5023
5029
5036
5038
5039
5043
5044
5045
5049
5054
505
5060
5062
5076
5077
5082
5092
5093
5101
5104
5115
5118
5123
5132
5133
5136
5141
5147
5152
5154
5157
5163
5164
5172
517
5181
5183
5185
5186
5189
5190
5192
5198
5199
51
5217
5220
5224
5230
5233
5239
5242
5244
5245
5246
5248
5252
5261
5269
5271
5278
5280
5285
5287
5290
5293
5296
5299
52
5304
5321
5322
5325
5328
5333
5337
5339
5340
534
5350
5355
5361
5375
5379
5386
5389
5390
5393
5400
5401
5405
5412
5424
5429
542
5439
5445
544
5456
5459
5460
5463
5468
5471
5480
5487
5506
5513
5514
551
5538
5545
5561
5565
5567
5569
557
5583
55
5604
5606
5620
5628
5635
5636
5641
5649
5652
5653
5660
5661
5665
5671
5678
567
5682
5684
5688
568
569
56
5700
5703
5717
5719
5720
5723
5724
5725
5727
572
5733
5735
5740
5746
5750
5756
5765
5767
576
5772
5776
5778
5781
5784
5789
5791
5796
57
5802
5808
5809
580
5810
581
5825
5826
5831
5837
583
5840
584
5854
585
5860
5867
5874
5876
587
5886
5890
5893
5894
589
58
5906
5909
5910
5911
5913
5914
5929
5933
5935
593
5940
5949
594
5951
5952
5968
5970
5975
5977
5979
597
5980
5983
598
5993
6000
6003
6006
6009
6010
6014
6019
6025
6030
6035
6051
6060
6064
6065
6072
6076
6077
6078
6080
6081
6084
6087
6088
608
6098
6099
60
6102
6106
6111
6119
6120
6121
6126
6127
6131
6135
6138
6139
613
6145
6147
614
6153
6159
6173
6177
6178
6181
6184
6188
6196
6199
6209
6211
6221
6224
6227
622
6232
6233
6235
6242
6248
6249
6251
6254
625
6272
6276
6281
6284
6286
6288
6294
62
6300
6308
6311
6317
6323
6324
6330
6332
6333
6339
6346
6351
6352
6353
6356
6358
6364
6367
6368
636
6370
6377
6378
637
6385
6391
6395
6399
639
6402
6406
6407
6411
6415
6418
6436
6437
6446
644
6454
6458
6459
6476
6482
6484
6488
6492
6494
6499
64
6505
6506
6512
6513
6529
6531
6533
6534
6535
6538
6539
6540
6548
6549
6550
6553
6557
6563
6567
6568
6574
6575
6583
6590
6594
65
6609
6610
6614
6620
6625
6627
6636
6637
663
6643
664
6652
6660
6668
6673
6674
6676
667
6685
6686
6687
6689
6690
6694
6695
669
66
6701
6705
6707
6709
6713
6724
6726
6727
6733
6735
6741
6743
6746
6747
6749
6752
6753
6754
6758
6773
6777
6784
6788
6792
6794
6798
679
6804
6807
6818
681
6821
6836
6846
6848
6849
684
6853
6865
6875
6877
6880
6882
6883
6892
6895
6902
6906
690
6912
6913
6914
6918
6923
6924
6925
6927
6943
6945
6947
6950
6951
6954
6962
6963
6965
6967
696
6974
6978
7000
7001
7008
7009
7011
7012
7026
7030
7046
7051
7055
7059
705
7061
7062
7065
7067
7069
7073
7078
7079
708
7090
7092
7095
7096
7097
70
7107
7113
7117
711
7121
7125
7128
712
7131
7134
7135
7138
7139
713
7143
7147
7148
7150
7155
7169
716
7170
7177
7178
7188
7189
718
7190
7197
7198
7199
7205
7208
720
7215
7218
7220
7223
7226
7228
7229
7238
7239
7240
7242
7245
7246
7247
7250
7255
7263
7264
7265
726
7277
7278
727
7285
7286
728
7299
7301
7302
7307
730
7312
7313
7315
731
7320
7326
7327
7331
7333
7337
7338
7342
7346
7348
7354
7357
7360
7367
7376
737
7383
7387
7389
7391
7392
7395
7398
7402
7408
7416
7423
7424
742
7433
7436
7445
7447
7448
7460
7463
7467
7475
7478
7480
7491
7492
7495
7498
7502
7505
7507
7510
7511
7512
7514
7515
7517
7518
7520
7522
7525
7538
753
7540
7552
7553
7555
7556
7558
7559
7561
7565
7584
7585
7594
7597
75
7603
7607
7608
7609
7618
7635
7640
7644
7647
7649
7654
7657
766
7672
7679
7683
7687
7691
7699
7700
7702
7704
7708
770
7713
7717
7720
7733
7737
7739
7746
7749
774
7752
7756
7762
7764
7766
7769
7777
7780
7786
7789
778
7794
7795
7796
779
77
7800
7802
780
7816
781
7823
7825
7826
7828
782
7833
7835
7839
783
7843
7848
7859
7871
7879
7883
7886
7892
7898
789
78
7909
7912
791
7923
7925
792
7932
7938
7939
7942
7945
7946
7949
7957
7959
7962
7967
797
7981
7988
7997
8005
8006
8008
8009
8012
8014
8015
8023
8033
803
8040
8042
8044
8057
8058
8063
8066
8071
8072
8075
807
8080
8087
8088
8095
8097
8098
8108
810
8112
8118
8119
811
8123
8138
8143
8148
8152
8156
815
8163
8164
8168
8169
816
8172
8176
8180
8183
8190
8193
8194
8195
8197
8199
81
8200
8208
820
8215
8222
8225
8226
8228
8238
8240
8242
8245
8246
8250
8259
8262
8266
826
8272
8273
8291
8295
8296
829
82
8300
8302
8307
830
8312
8316
831
8321
8322
8324
8328
8329
8334
8337
8346
8347
8356
8367
836
8382
8388
8389
8392
8394
8396
839
83
8401
8410
8413
8414
8415
8419
8421
8422
8424
8425
8430
8432
8441
8443
8444
8445
8447
844
8459
845
8465
8466
8468
846
8470
8474
8476
8490
8494
8498
8499
8500
8506
850
851
8527
8531
8534
8536
8543
8544
8545
8565
8573
8575
8576
8580
8587
8590
8591
8592
85
8609
8625
8629
8630
8631
8632
8635
8644
8664
8666
8671
8675
8677
8678
8684
8687
868
8699
8705
8710
8713
8722
8725
8742
8747
8753
8758
8765
876
8770
8772
8776
8778
8786
8791
8797
8799
87
8803
8808
8820
8825
882
8838
8846
8848
884
8855
8867
886
8875
887
8887
8897
895
8975
89
9000
9022
909
90
911
915
91
921
922
923
925
927
937
93
949
94
951
956
957
960
964
969
976
978
979
982
984
985
986
98
================================================
FILE: data/youdao/text/speed
================================================
语速普通
语速很快
语速很慢
================================================
FILE: data/youdao/text/tokenlist
================================================
_
<sos/eos>
[AA0]
[AA1]
[AA2]
[AE0]
[AE1]
[AE2]
[AH0]
[AH1]
[AH2]
[AO0]
[AO1]
[AO2]
[AW0]
[AW1]
[AW2]
[AY0]
[AY1]
[AY2]
[B]
[CH]
[DH]
[D]
[EH0]
[EH1]
[EH2]
[ER0]
[ER1]
[ER2]
[EY0]
[EY1]
[EY2]
[F]
[G]
[HH]
[IH0]
[IH1]
[IH2]
[IY0]
[IY1]
[IY2]
[JH]
[K]
[L]
[M]
[NG]
[N]
[OW0]
[OW1]
[OW2]
[OY0]
[OY1]
[OY2]
[P]
[R]
[SH]
[S]
[TH]
[T]
[UH0]
[UH1]
[UH2]
[UW0]
[UW1]
[UW2]
[V]
[W]
[Y]
[ZH]
[Z]
a1
a2
a3
a4
a5
ai1
ai2
ai3
ai4
ai5
air1
air2
air4
air5
an1
an2
an3
an4
an5
ang1
ang2
ang3
ang4
ang5
angr1
angr2
angr4
anr1
anr2
anr3
anr4
ao1
ao2
ao3
ao4
ao5
aor1
aor2
aor3
aor4
ar1
ar2
ar3
ar4
ar5
arr4
b
c
ch
cn_eng_sp
d
e1
e2
e3
e4
e5
ei1
ei2
ei3
ei4
ei5
eir1
eir4
en1
en2
en3
en4
en5
eng1
eng2
eng3
eng4
eng5
eng_cn_sp
engr1
engr3
engr4
engsp1
engsp2
engsp4
enr1
enr2
enr3
enr4
enr5
er1
er2
er3
er4
er5
f
g
h
i1
i2
i3
i4
i5
ia1
ia2
ia3
ia4
ia5
ian1
ian2
ian3
ian4
ian5
iang1
iang2
iang3
iang4
iang5
iangr2
iangr4
ianr1
ianr2
ianr3
ianr4
ianr5
iao1
iao2
iao3
iao4
iao5
iaor2
iaor3
iaor4
iar2
iar3
iar4
ie1
ie2
ie3
ie4
ie5
ier4
ii1
ii2
ii3
ii4
ii5
iii1
iii2
iii3
iii4
iii5
iiir2
iiir3
iiir4
iir2
iir3
iir4
in1
in2
in3
in4
in5
ing1
ing2
ing3
ing4
ing5
ingr1
ingr2
ingr3
ingr4
inr1
inr4
iong1
iong2
iong3
iong4
iong5
iou1
iou2
iou3
iou4
iou5
iour2
iour3
iour4
ir1
ir2
ir3
ir4
irr1
j
k
l
m
n
o1
o2
o3
o4
o5
ong1
ong2
ong3
ong4
ong5
ongr2
ongr3
ongr4
or4
ou1
ou2
ou3
ou4
ou5
our1
our2
our3
our4
our5
p
q
r
s
sh
sp0
sp1
sp2
sp3
sp4
t
u1
u2
u3
u4
u5
ua1
ua2
ua3
ua4
ua5
uai1
uai2
uai3
uai4
uai5
uair4
uan1
uan2
uan3
uan4
uan5
uang1
uang2
uang3
uang4
uang5
uanr1
uanr2
uanr3
uanr4
uanr5
uar1
uar2
uar3
uar4
uei1
uei2
uei3
uei4
uei5
ueir1
ueir2
ueir3
ueir4
uen1
uen2
uen3
uen4
uen5
ueng1
ueng3
ueng4
uenr1
uenr2
uenr3
uenr4
uo1
uo2
uo3
uo4
uo5
uor1
uor2
uor3
uor4
uor5
ur1
ur2
ur3
ur4
ur5
v1
v2
v3
v4
v5
van1
van2
van3
van4
van5
vanr1
vanr2
vanr3
vanr4
ve1
ve2
ve3
ve4
ve5
ver2
vn1
vn2
vn3
vn4
vn5
vr2
vr3
vr4
vr5
x
y
z
zh
engsp0
?
.
spn
ue2
!
err1
[LAUGH]
rr
ier2
or1
ueng2
ir5
iar1
iour1
uncased15
uncased16
uncased17
uncased18
uncased19
uncased20
uncased21
uncased22
uncased23
uncased24
uncased25
uncased26
uncased27
uncased28
uncased29
uncased30
uncased31
uncased32
uncased33
uncased34
uncased35
uncased36
uncased37
uncased38
uncased39
uncased40
uncased41
uncased42
uncased43
uncased44
uncased45
uncased46
uncased47
uncased48
uncased49
uncased50
uncased51
uncased52
uncased53
uncased54
uncased55
uncased56
uncased57
uncased58
uncased59
uncased60
uncased61
uncased62
uncased63
uncased64
uncased65
uncased66
uncased67
uncased68
uncased69
uncased70
uncased71
uncased72
uncased73
uncased74
uncased75
uncased76
uncased77
uncased78
uncased79
uncased80
uncased81
uncased82
uncased83
uncased84
uncased85
uncased86
uncased87
uncased88
uncased89
uncased90
uncased91
uncased92
uncased93
uncased94
uncased95
uncased96
uncased97
uncased98
uncased99
================================================
FILE: demo_page.py
================================================
# Copyright 2023, YOUDAO
#
# 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 streamlit as st
import os, glob
import numpy as np
from yacs import config as CONFIG
import torch
import re
from frontend import g2p_cn_en, ROOT_DIR, read_lexicon, G2p
from config.joint.config import Config
from models.prompt_tts_modified.jets import JETSGenerator
from models.prompt_tts_modified.simbert import StyleEncoder
from transformers import AutoTokenizer
import base64
from pathlib import Path
DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")
MAX_WAV_VALUE = 32768.0
config = Config()
def create_download_link():
pdf_path = Path("EmotiVoice_UserAgreement_易魔声用户协议.pdf")
base64_pdf = base64.b64encode(pdf_path.read_bytes()).decode("utf-8") # val looks like b'...'
return f'<a href="data:application/octet-stream;base64,{base64_pdf}" download="EmotiVoice_UserAgreement_易魔声用户协议.pdf.pdf">EmotiVoice_UserAgreement_易魔声用户协议.pdf</a>'
html=create_download_link()
st.set_page_config(
page_title="demo page",
page_icon="📕",
)
st.write("# Text-To-Speech")
st.markdown(f"""
### How to use:
- Simply select a **Speaker ID**, type in the **text** you want to convert and the emotion **Prompt**, like a single word or even a sentence. Then click on the **Synthesize** button below to start voice synthesis.
- You can download the audio by clicking on the vertical three points next to the displayed audio widget.
- For more information on **'Speaker ID'**, please consult the [EmotiVoice voice wiki page](https://github.com/netease-youdao/EmotiVoice/tree/main/data/youdao/text)
- This interactive demo page is provided under the {html} file. The audio is synthesized by AI. 音频由AI合成,仅供参考。
""", unsafe_allow_html=True)
def scan_checkpoint(cp_dir, prefix, c=8):
pattern = os.path.join(cp_dir, prefix + '?'*c)
cp_list = glob.glob(pattern)
if len(cp_list) == 0:
return None
return sorted(cp_list)[-1]
@st.cache_resource
def get_models():
am_checkpoint_path = scan_checkpoint(f'{config.output_directory}/prompt_tts_open_source_joint/ckpt', 'g_')
style_encoder_checkpoint_path = scan_checkpoint(f'{config.output_directory}/style_encoder/ckpt', 'checkpoint_', 6)#f'{config.output_directory}/style_encoder/ckpt/checkpoint_163431'
with open(config.model_config_path, 'r') as fin:
conf = CONFIG.load_cfg(fin)
conf.n_vocab = config.n_symbols
conf.n_speaker = config.speaker_n_labels
style_encoder = StyleEncoder(config)
model_CKPT = torch.load(style_encoder_checkpoint_path, map_location="cpu")
model_ckpt = {}
for key, value in model_CKPT['model'].items():
new_key = key[7:]
model_ckpt[new_key] = value
style_encoder.load_state_dict(model_ckpt, strict=False)
generator = JETSGenerator(conf).to(DEVICE)
model_CKPT = torch.load(am_checkpoint_path, map_location=DEVICE)
generator.load_state_dict(model_CKPT['generator'])
generator.eval()
tokenizer = AutoTokenizer.from_pretrained(config.bert_path)
with open(config.token_list_path, 'r') as f:
token2id = {t.strip():idx for idx, t, in enumerate(f.readlines())}
with open(config.speaker2id_path, encoding='utf-8') as f:
speaker2id = {t.strip():idx for idx, t in enumerate(f.readlines())}
return (style_encoder, generator, tokenizer, token2id, speaker2id)
def get_style_embedding(prompt, tokenizer, style_encoder):
prompt = tokenizer([prompt], return_tensors="pt")
input_ids = prompt["input_ids"]
token_type_ids = prompt["token_type_ids"]
attention_mask = prompt["attention_mask"]
with torch.no_grad():
output = style_encoder(
input_ids=input_ids,
token_type_ids=token_type_ids,
attention_mask=attention_mask,
)
style_embedding = output["pooled_output"].cpu().squeeze().numpy()
return style_embedding
def tts(name, text, prompt, content, speaker, models):
(style_encoder, generator, tokenizer, token2id, speaker2id)=models
style_embedding = get_style_embedding(prompt, tokenizer, style_encoder)
content_embedding = get_style_embedding(content, tokenizer, style_encoder)
speaker = speaker2id[speaker]
text_int = [token2id[ph] for ph in text.split()]
sequence = torch.from_numpy(np.array(text_int)).to(DEVICE).long().unsqueeze(0)
sequence_len = torch.from_numpy(np.array([len(text_int)])).to(DEVICE)
style_embedding = torch.from_numpy(style_embedding).to(DEVICE).unsqueeze(0)
content_embedding = torch.from_numpy(content_embedding).to(DEVICE).unsqueeze(0)
speaker = torch.from_numpy(np.array([speaker])).to(DEVICE)
with torch.no_grad():
infer_output = generator(
inputs_ling=sequence,
inputs_style_embedding=style_embedding,
input_lengths=sequence_len,
inputs_content_embedding=content_embedding,
inputs_speaker=speaker,
alpha=1.0
)
audio = infer_output["wav_predictions"].squeeze()* MAX_WAV_VALUE
audio = audio.cpu().numpy().astype('int16')
return audio
speakers = config.speakers
models = get_models()
lexicon = read_lexicon(f"{ROOT_DIR}/lexicon/librispeech-lexicon.txt")
g2p = G2p()
def new_line(i):
col1, col2, col3, col4 = st.columns([1.5, 1.5, 3.5, 1.3])
with col1:
speaker=st.selectbox("Speaker ID (说话人)", speakers, key=f"{i}_speaker")
with col2:
prompt=st.text_input("Prompt (开心/悲伤)", "", key=f"{i}_prompt")
with col3:
content=st.text_input("Text to be synthesized into speech (合成文本)", "合成文本", key=f"{i}_text")
with col4:
lang=st.selectbox("Language (语言)", ["zh_us"], key=f"{i}_lang")
flag = st.button(f"Synthesize (合成)", key=f"{i}_button1")
if flag:
text = g2p_cn_en(content, g2p, lexicon)
path = tts(i, text, prompt, content, speaker, models)
st.audio(path, sample_rate=config.sampling_rate)
new_line(0)
================================================
FILE: demo_page_databaker.py
================================================
# Copyright 2023, YOUDAO
#
# 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 streamlit as st
import os, glob
import numpy as np
from yacs import config as CONFIG
import torch
import re
from frontend import g2p_cn_en, ROOT_DIR, read_lexicon, G2p
from exp.DataBaker.config.config import Config
from models.prompt_tts_modified.jets import JETSGenerator
from models.prompt_tts_modified.simbert import StyleEncoder
from transformers import AutoTokenizer
import base64
from pathlib import Path
DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")
MAX_WAV_VALUE = 32768.0
config = Config()
def create_download_link():
pdf_path = Path("EmotiVoice_UserAgreement_易魔声用户协议.pdf")
base64_pdf = base64.b64encode(pdf_path.read_bytes()).decode("utf-8") # val looks like b'...'
return f'<a href="data:application/octet-stream;base64,{base64_pdf}" download="EmotiVoice_UserAgreement_易魔声用户协议.pdf.pdf">EmotiVoice_UserAgreement_易魔声用户协议.pdf</a>'
html=create_download_link()
st.set_page_config(
page_title="demo page",
page_icon="📕",
)
st.write("# Text-To-Speech")
st.markdown(f"""
### How to use:
- Simply select a **Speaker ID**, type in the **text** you want to convert and the emotion **Prompt**, like a single word or even a sentence. Then click on the **Synthesize** button below to start voice synthesis.
- You can download the audio by clicking on the vertical three points next to the displayed audio widget.
- For more information on **'Speaker ID'**, please consult the [EmotiVoice voice wiki page](https://github.com/netease-youdao/EmotiVoice/tree/main/data/youdao/text)
- This interactive demo page is provided under the {html} file. The audio is synthesized by AI. 音频由AI合成,仅供参考。
""", unsafe_allow_html=True)
def scan_checkpoint(cp_dir, prefix, c=8):
pattern = os.path.join(cp_dir, prefix + '?'*c)
cp_list = glob.glob(pattern)
if len(cp_list) == 0:
return None
return sorted(cp_list)[-1]
@st.cache_resource
def get_models():
am_checkpoint_path = scan_checkpoint(f'{config.output_directory}/ckpt', 'g_')
style_encoder_checkpoint_path = config.style_encoder_ckpt
with open(config.model_config_path, 'r') as fin:
conf = CONFIG.load_cfg(fin)
conf.n_vocab = config.n_symbols
conf.n_speaker = config.speaker_n_labels
style_encoder = StyleEncoder(config)
model_CKPT = torch.load(style_encoder_checkpoint_path, map_location="cpu")
model_ckpt = {}
for key, value in model_CKPT['model'].items():
new_key = key[7:]
model_ckpt[new_key] = value
style_encoder.load_state_dict(model_ckpt, strict=False)
generator = JETSGenerator(conf).to(DEVICE)
model_CKPT = torch.load(am_checkpoint_path, map_location=DEVICE)
generator.load_state_dict(model_CKPT['generator'])
generator.eval()
tokenizer = AutoTokenizer.from_pretrained(config.bert_path)
with open(config.token_list_path, 'r') as f:
token2id = {t.strip():idx for idx, t, in enumerate(f.readlines())}
with open(config.speaker2id_path, encoding='utf-8') as f:
speaker2id = {t.strip():idx for idx, t in enumerate(f.readlines())}
return (style_encoder, generator, tokenizer, token2id, speaker2id)
def get_style_embedding(prompt, tokenizer, style_encoder):
prompt = tokenizer([prompt], return_tensors="pt")
input_ids = prompt["input_ids"]
token_type_ids = prompt["token_type_ids"]
attention_mask = prompt["attention_mask"]
with torch.no_grad():
output = style_encoder(
input_ids=input_ids,
token_type_ids=token_type_ids,
attention_mask=attention_mask,
)
style_embedding = output["pooled_output"].cpu().squeeze().numpy()
return style_embedding
def tts(name, text, prompt, content, speaker, models):
(style_encoder, generator, tokenizer, token2id, speaker2id)=models
style_embedding = get_style_embedding(prompt, tokenizer, style_encoder)
content_embedding = get_style_embedding(content, tokenizer, style_encoder)
speaker = speaker2id[speaker]
text_int = [token2id[ph] for ph in text.split()]
sequence = torch.from_numpy(np.array(text_int)).to(DEVICE).long().unsqueeze(0)
sequence_len = torch.from_numpy(np.array([len(text_int)])).to(DEVICE)
style_embedding = torch.from_numpy(style_embedding).to(DEVICE).unsqueeze(0)
content_embedding = torch.from_numpy(content_embedding).to(DEVICE).unsqueeze(0)
speaker = torch.from_numpy(np.array([speaker])).to(DEVICE)
with torch.no_grad():
infer_output = generator(
inputs_ling=sequence,
inputs_style_embedding=style_embedding,
input_lengths=sequence_len,
inputs_content_embedding=content_embedding,
inputs_speaker=speaker,
alpha=1.0
)
audio = infer_output["wav_predictions"].squeeze()* MAX_WAV_VALUE
audio = audio.cpu().numpy().astype('int16')
return audio
speakers = config.speakers
models = get_models()
lexicon = read_lexicon(f"{ROOT_DIR}/lexicon/librispeech-lexicon.txt")
g2p = G2p()
def new_line(i):
col1, col2, col3, col4 = st.columns([1.5, 1.5, 3.5, 1.3])
with col1:
speaker=st.selectbox("Speaker ID (说话人)", speakers, key=f"{i}_speaker")
with col2:
prompt=st.text_input("Prompt (开心/悲伤)", "", key=f"{i}_prompt")
with col3:
content=st.text_input("Text to be synthesized into speech (合成文本)", "合成文本", key=f"{i}_text")
with col4:
lang=st.selectbox("Language (语言)", ["zh_us"], key=f"{i}_lang")
flag = st.button(f"Synthesize (合成)", key=f"{i}_button1")
if flag:
text = g2p_cn_en(content, g2p, lexicon)
path = tts(i, text, prompt, content, speaker, models)
st.audio(path, sample_rate=config.sampling_rate)
new_line(0)
================================================
FILE: frontend.py
================================================
# Copyright 2023, YOUDAO
#
# 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 re
from frontend_cn import g2p_cn, re_digits, tn_chinese
from frontend_en import ROOT_DIR, read_lexicon, G2p, get_eng_phoneme
# Thanks to GuGCoCo and PatroxGaurab for identifying the issue:
# the results differ between frontend.py and frontend_en.py. Here's a quick fix.
#re_english_word = re.compile('([a-z\-\.\'\s,;\:\!\?]+|\d+[\d\.]*)', re.I)
re_english_word = re.compile('([^\u4e00-\u9fa5]+|[ \u3002\uff0c\uff1f\uff01\uff1b\uff1a\u201c\u201d\u2018\u2019\u300a\u300b\u3008\u3009\u3010\u3011\u300e\u300f\u2014\u2026\u3001\uff08\uff09\u4e00-\u9fa5]+)', re.I)
def g2p_cn_en(text, g2p, lexicon):
# Our policy dictates that if the text contains Chinese, digits are to be converted into Chinese.
text=tn_chinese(text)
parts = re_english_word.split(text)
parts=list(filter(None, parts))
tts_text = ["<sos/eos>"]
chartype = ''
text_contains_chinese = contains_chinese(text)
for part in parts:
if part == ' ' or part == '': continue
if re_digits.match(part) and (text_contains_chinese or chartype == '') or contains_chinese(part):
if chartype == 'en':
tts_text.append('eng_cn_sp')
phoneme = g2p_cn(part).split()[1:-1]
chartype = 'cn'
elif re_english_word.match(part):
if chartype == 'cn':
if "sp" in tts_text[-1]:
""
else:
tts_text.append('cn_eng_sp')
phoneme = get_eng_phoneme(part, g2p, lexicon, False).split()
if not phoneme :
# tts_text.pop()
continue
else:
chartype = 'en'
else:
continue
tts_text.extend( phoneme )
tts_text=" ".join(tts_text).split()
if "sp" in tts_text[-1]:
tts_text.pop()
tts_text.append("<sos/eos>")
return " ".join(tts_text)
def contains_chinese(text):
pattern = re.compile(r'[\u4e00-\u9fa5]')
match = re.search(pattern, text)
return match is not None
if __name__ == "__main__":
import sys
from os.path import isfile
lexicon = read_lexicon(f"{ROOT_DIR}/lexicon/librispeech-lexicon.txt")
g2p = G2p()
if len(sys.argv) < 2:
print("Usage: python %s <text>" % sys.argv[0])
exit()
text_file = sys.argv[1]
if isfile(text_file):
fp = open(text_file, 'r')
for line in fp:
phoneme = g2p_cn_en(line.rstrip(), g2p, lexicon)
print(phoneme)
fp.close()
================================================
FILE: frontend_cn.py
================================================
# Copyright 2023, YOUDAO
#
# 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 re
from pypinyin import pinyin, lazy_pinyin, Style
import jieba
import string
from cn2an.an2cn import An2Cn
from pypinyin_dict.phrase_pinyin_data import cc_cedict
cc_cedict.load()
re_special_pinyin = re.compile(r'^(n|ng|m)$')
def split_py(py):
tone = py[-1]
py = py[:-1]
sm = ""
ym = ""
suf_r = ""
if re_special_pinyin.match(py):
py = 'e' + py
if py[-1] == 'r':
suf_r = 'r'
py = py[:-1]
if py == 'zi' or py == 'ci' or py == 'si' or py == 'ri':
sm = py[:1]
ym = "ii"
elif py == 'zhi' or py == 'chi' or py == 'shi':
sm = py[:2]
ym = "iii"
elif py == 'ya' or py == 'yan' or py == 'yang' or py == 'yao' or py == 'ye' or py == 'yong' or py == 'you':
sm = ""
ym = 'i' + py[1:]
elif py == 'yi' or py == 'yin' or py == 'ying':
sm = ""
ym = py[1:]
elif py == 'yu' or py == 'yv' or py == 'yuan' or py == 'yvan' or py == 'yue ' or py == 'yve' or py == 'yun' or py == 'yvn':
sm = ""
ym = 'v' + py[2:]
elif py == 'wu':
sm = ""
ym = "u"
elif py[0] == 'w':
sm = ""
ym = "u" + py[1:]
elif len(py) >= 2 and (py[0] == 'j' or py[0] == 'q' or py[0] == 'x') and py[1] == 'u':
sm = py[0]
ym = 'v' + py[2:]
else:
seg_pos = re.search('a|e|i|o|u|v', py)
sm = py[:seg_pos.start()]
ym = py[seg_pos.start():]
if ym == 'ui':
ym = 'uei'
elif ym == 'iu':
ym = 'iou'
elif ym == 'un':
ym = 'uen'
elif ym == 'ue':
ym = 've'
ym += suf_r + tone
return sm, ym
chinese_punctuation_pattern = r'[\u3002\uff0c\uff1f\uff01\uff1b\uff1a\u201c\u201d\u2018\u2019\u300a\u300b\u3008\u3009\u3010\u3011\u300e\u300f\u2014\u2026\u3001\uff08\uff09]'
def has_chinese_punctuation(text):
match = re.search(chinese_punctuation_pattern, text)
return match is not None
def has_english_punctuation(text):
return text in string.punctuation
# with thanks to KimigaiiWuyi in https://github.com/netease-youdao/EmotiVoice/pull/17.
# Updated on November 20, 2023: EmotiVoice now incorporates cn2an (https://github.com/Ailln/cn2an) for number processing.
re_digits = re.compile('(\d[\d\.]*)')
def number_to_chinese(number):
an2cn = An2Cn()
result = an2cn.an2cn(number)
return result
def tn_chinese(text):
parts = re_digits.split(text)
words = []
for part in parts:
if re_digits.match(part):
words.append(number_to_chinese(part))
else:
words.append(part)
return ''.join(words)
def g2p_cn(text):
res_text=["<sos/eos>"]
seg_list = jieba.cut(text)
for seg in seg_list:
if seg == " ": continue
seg_tn = tn_chinese(seg)
py =[_py[0] for _py in pinyin(seg_tn, style=Style.TONE3,neutral_tone_with_five=True)]
if any([has_chinese_punctuation(_py) for _py in py]) or any([has_english_punctuation(_py) for _py in py]):
res_text.pop()
res_text.append("sp3")
else:
py = [" ".join(split_py(_py)) for _py in py]
res_text.append(" sp0 ".join(py))
res_text.append("sp1")
#res_text.pop()
res_text.append("<sos/eos>")
return " ".join(res_text)
if __name__ == "__main__":
import sys
from os.path import isfile
if len(sys.argv) < 2:
print("Usage: python %s <text>" % sys.argv[0])
exit()
text_file = sys.argv[1]
if isfile(text_file):
fp = open(text_file, 'r')
for line in fp:
phoneme=g2p_cn(line.rstrip())
print(phoneme)
fp.close()
================================================
FILE: frontend_en.py
================================================
# Copyright 2023, YOUDAO
#
# 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 re
import argparse
from string import punctuation
import numpy as np
from g2p_en import G2p
import os
ROOT_DIR = os.path.dirname(os.path.abspath("__file__"))
def read_lexicon(lex_path):
lexicon = {}
with open(lex_path) as f:
for line in f:
temp = re.split(r"\s+", line.strip("\n"))
word = temp[0]
phones = temp[1:]
if word.lower() not in lexicon:
lexicon[word.lower()] = phones
return lexicon
def get_eng_phoneme(text, g2p, lexicon, pad_sos_eos=True):
"""
english g2p
"""
filters = {",", " ", "'"}
phones = []
words = list(filter(lambda x: x not in {"", " "}, re.split(r"([,;.\-\?\!\s+])", text)))
for w in words:
if w.lower() in lexicon:
for ph in lexicon[w.lower()]:
if ph not in filters:
phones += ["[" + ph + "]"]
if "sp" not in phones[-1]:
phones += ["engsp1"]
else:
phone=g2p(w)
if not phone:
continue
if phone[0].isalnum():
for ph in phone:
if ph not in filters:
phones += ["[" + ph + "]"]
if ph == " " and "sp" not in phones[-1]:
phones += ["engsp1"]
elif phone == " ":
continue
elif phones:
phones.pop() # pop engsp1
phones.append("engsp4")
if phones and "engsp" in phones[-1]:
phones.pop()
# mark = "." if text[-1] != "?" else "?"
if pad_sos_eos:
phones = ["<sos/eos>"] + phones + ["<sos/eos>"]
return " ".join(phones)
if __name__ == "__main__":
lexicon = read_lexicon(f"{ROOT_DIR}/lexicon/librispeech-lexicon.txt")
g2p = G2p()
phonemes= get_eng_phoneme("Happy New Year", g2p, lexicon)
import sys
from os.path import isfile
if len(sys.argv) < 2:
print("Usage: python %s <text>" % sys.argv[0])
exit()
text_file = sys.argv[1]
if isfile(text_file):
fp = open(text_file, 'r')
for line in fp:
phoneme=get_eng_phoneme(line.rstrip(), g2p, lexicon)
print(phoneme)
fp.close()
================================================
FILE: inference_am_vocoder_exp.py
================================================
# Copyright 2023, YOUDAO
#
# 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.
from models.prompt_tts_modified.jets import JETSGenerator
from models.prompt_tts_modified.simbert import StyleEncoder
from transformers import AutoTokenizer
import os, sys, warnings, torch, glob, argparse
import numpy as np
from models.hifigan.get_vocoder import MAX_WAV_VALUE
import soundfile as sf
from yacs import config as CONFIG
from tqdm import tqdm
def get_style_embedding(prompt, tokenizer, style_encoder):
prompt = tokenizer([prompt], return_tensors="pt")
input_ids = prompt["input_ids"]
token_type_ids = prompt["token_type_ids"]
attention_mask = prompt["attention_mask"]
with torch.no_grad():
output = style_encoder(
input_ids=input_ids,
token_type_ids=token_type_ids,
attention_mask=attention_mask,
)
style_embedding = output["pooled_output"].cpu().squeeze().numpy()
return style_embedding
def main(args, config):
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
root_path = os.path.join(config.output_directory)
ckpt_path = os.path.join(root_path, "ckpt")
files = os.listdir(ckpt_path)
for file in files:
if args.checkpoint:
if file != args.checkpoint:
continue
checkpoint_path = os.path.join(ckpt_path, file)
with open(config.model_config_path, 'r') as fin:
conf = CONFIG.load_cfg(fin)
conf.n_vocab = config.n_symbols
conf.n_speaker = config.speaker_n_labels
style_encoder = StyleEncoder(config)
model_CKPT = torch.load(config.style_encoder_ckpt, map_location="cpu")
model_ckpt = {}
for key, value in model_CKPT['model'].items():
new_key = key[7:]
model_ckpt[new_key] = value
style_encoder.load_state_dict(model_ckpt, strict=False)
generator = JETSGenerator(conf).to(device)
model_CKPT = torch.load(checkpoint_path, map_location=device)
generator.load_state_dict(model_CKPT['generator'])
generator.eval()
with open(config.token_list_path, 'r') as f:
token2id = {t.strip():idx for idx, t, in enumerate(f.readlines())}
with open(config.speaker2id_path, encoding='utf-8') as f:
speaker2id = {t.strip():idx for idx, t in enumerate(f.readlines())}
tokenizer = AutoTokenizer.from_pretrained(config.bert_path)
text_path = args.test_file
if os.path.exists(root_path + "/test_audio/audio/" +f"{file}/"):
r = glob.glob(root_path + "/test_audio/audio/" +f"{file}/*")
for j in r:
os.remove(j)
texts = []
prompts = []
speakers = []
contents = []
with open(text_path, "r") as f:
for line in f:
line = line.strip().split("|")
speakers.append(line[0])
prompts.append(line[1])
texts.append(line[2].split())
contents.append(line[3])
for i, (speaker, prompt, text, content) in enumerate(tqdm(zip(speakers, prompts, texts, contents))):
style_embedding = get_style_embedding(prompt, tokenizer, style_encoder)
content_embedding = get_style_embedding(content, tokenizer, style_encoder)
if speaker not in speaker2id:
continue
speaker = speaker2id[speaker]
text_int = [token2id[ph] for ph in text]
sequence = torch.from_numpy(np.array(text_int)).to(device).long().unsqueeze(0)
sequence_len = torch.from_numpy(np.array([len(text_int)])).to(device)
style_embedding = torch.from_numpy(style_embedding).to(device).unsqueeze(0)
content_embedding = torch.from_numpy(content_embedding).to(device).unsqueeze(0)
speaker = torch.from_numpy(np.array([speaker])).to(device)
with torch.no_grad():
infer_output = generator(
inputs_ling=sequence,
inputs_style_embedding=style_embedding,
input_lengths=sequence_len,
inputs_content_embedding=content_embedding,
inputs_speaker=speaker,
alpha=1.0
)
audio = infer_output["wav_predictions"].squeeze()* MAX_WAV_VALUE
audio = audio.cpu().numpy().astype('int16')
if not os.path.exists(root_path + "/test_audio/audio/" +f"{file}/"):
os.makedirs(root_path + "/test_audio/audio/" +f"{file}/", exist_ok=True)
sf.write(file=root_path + "/test_audio/audio/" +f"{file}/{i+1}.wav", data=audio, samplerate=config.sampling_rate) #h.sampling_rate
if __name__ == '__main__':
print("run!")
p = argparse.ArgumentParser()
p.add_argument("-c", "--config_folder", type=str, required=True)
p.add_argument("--checkpoint", type=str, required=False, default='', help='inference specific checkpoint, e.g --checkpoint checkpoint_230000')
p.add_argument('-t', '--test_file', type=str, required=True, help='the absolute path of test file that is going to inference')
args = p.parse_args()
##################################################
sys.path.append(os.path.dirname(os.path.abspath("__file__")) + "/" + args.config_folder)
from config import Config
config = Config()
##################################################
main(args, config)
================================================
FILE: inference_am_vocoder_joint.py
================================================
# Copyright 2023, YOUDAO
#
# 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.
from models.prompt_tts_modified.jets import JETSGenerator
from models.prompt_tts_modified.simbert import StyleEncoder
from transformers import AutoTokenizer
import os, sys, warnings, torch, glob, argparse
import numpy as np
from models.hifigan.get_vocoder import MAX_WAV_VALUE
import soundfile as sf
from yacs import config as CONFIG
from tqdm import tqdm
def get_style_embedding(prompt, tokenizer, style_encoder):
gitextract_051xhzd2/ ├── .dockerignore ├── .gitignore ├── Dockerfile ├── HTTP_API_TtsDemo/ │ ├── README.md │ └── apidemo/ │ ├── TtsDemo.py │ └── utils/ │ └── AuthV3Util.py ├── LICENSE ├── README.md ├── README.zh.md ├── README_小白安装教程.md ├── ROADMAP.md ├── cn2an/ │ ├── an2cn.py │ └── conf.py ├── cog.yaml ├── config/ │ ├── joint/ │ │ ├── config.py │ │ └── config.yaml │ └── template.py ├── data/ │ ├── DataBaker/ │ │ ├── README.md │ │ └── src/ │ │ ├── step0_download.sh │ │ ├── step1_clean_raw_data.py │ │ └── step2_get_phoneme.py │ ├── LJspeech/ │ │ ├── README.md │ │ └── src/ │ │ ├── step0_download.sh │ │ ├── step1_clean_raw_data.py │ │ └── step2_get_phoneme.py │ ├── inference/ │ │ └── text │ └── youdao/ │ └── text/ │ ├── README.md │ ├── emotion │ ├── energy │ ├── pitch │ ├── speaker2 │ ├── speed │ └── tokenlist ├── demo_page.py ├── demo_page_databaker.py ├── frontend.py ├── frontend_cn.py ├── frontend_en.py ├── inference_am_vocoder_exp.py ├── inference_am_vocoder_joint.py ├── inference_tts.py ├── lexicon/ │ └── librispeech-lexicon.txt ├── mel_process.py ├── mfa/ │ ├── step1_create_dataset.py │ ├── step2_prepare_data.py │ ├── step3_prepare_special_tokens.py │ ├── step4_convert_text_to_phn.py │ ├── step5_prepare_alignment.py │ ├── step7_gen_alignment_from_textgrid.py │ ├── step8_make_data_list.py │ └── step9_datalist_from_mfa.py ├── models/ │ ├── hifigan/ │ │ ├── dataset.py │ │ ├── env.py │ │ ├── get_random_segments.py │ │ ├── get_vocoder.py │ │ ├── models.py │ │ └── pretrained_discriminator.py │ └── prompt_tts_modified/ │ ├── audio_processing.py │ ├── feats.py │ ├── jets.py │ ├── loss.py │ ├── model_open_source.py │ ├── modules/ │ │ ├── alignment.py │ │ ├── encoder.py │ │ ├── initialize.py │ │ └── variance.py │ ├── prompt_dataset.py │ ├── scheduler.py │ ├── simbert.py │ ├── stft.py │ ├── style_encoder.py │ └── tacotron_stft.py ├── openaiapi.py ├── plot_image.py ├── predict.py ├── prepare_for_training.py ├── requirements.openaiapi.txt ├── requirements.txt ├── setup.py ├── text/ │ ├── __init__.py │ ├── cleaners.py │ ├── cmudict.py │ ├── numbers.py │ └── symbols.py └── train_am_vocoder_joint.py
SYMBOL INDEX (380 symbols across 56 files)
FILE: HTTP_API_TtsDemo/apidemo/TtsDemo.py
function createRequest (line 14) | def createRequest():
function doCall (line 31) | def doCall(url, header, params, method):
function saveFile (line 38) | def saveFile(res):
FILE: HTTP_API_TtsDemo/apidemo/utils/AuthV3Util.py
function addAuthParams (line 17) | def addAuthParams(appKey, appSecret, params):
function calculateSign (line 40) | def calculateSign(appKey, appSecret, q, salt, curtime):
function encrypt (line 45) | def encrypt(strSrc):
function getInput (line 51) | def getInput(input):
FILE: cn2an/an2cn.py
class An2Cn (line 13) | class An2Cn(object):
method __init__ (line 14) | def __init__(self) -> None:
method an2cn (line 20) | def an2cn(self, inputs: Union[str, int, float] = None, mode: str = "lo...
method __direct_convert (line 116) | def __direct_convert(self, inputs: str) -> str:
method __number_to_string (line 126) | def __number_to_string(number_data: Union[int, float]) -> str:
method __check_inputs_is_valid (line 139) | def __check_inputs_is_valid(self, check_data: str) -> None:
method __integer_convert (line 146) | def __integer_convert(self, integer_data: str, mode: str) -> str:
method __decimal_convert (line 187) | def __decimal_convert(self, decimal_data: str, o_mode: str) -> str:
FILE: config/joint/config.py
function get_labels_length (line 18) | def get_labels_length(file_path):
class Config (line 32) | class Config:
FILE: config/template.py
function get_labels_length (line 18) | def get_labels_length(file_path):
class Config (line 32) | class Config:
FILE: data/DataBaker/src/step1_clean_raw_data.py
function main (line 13) | def main(args):
FILE: data/DataBaker/src/step2_get_phoneme.py
function g2p_cn_en (line 35) | def g2p_cn_en(text, g2p, lexicon):
function get_eng_phoneme (line 73) | def get_eng_phoneme(text, g2p, lexicon):
function onetime (line 114) | def onetime(resource, sample):
function onetime2 (line 127) | def onetime2(resource, sample):
function get_phoneme (line 148) | def get_phoneme(text, g2p):
function main (line 163) | def main(args):
FILE: data/LJspeech/src/step1_clean_raw_data.py
function main (line 22) | def main(args):
FILE: data/LJspeech/src/step2_get_phoneme.py
function onetime (line 30) | def onetime(resource, sample):
function get_phoneme (line 43) | def get_phoneme(text, g2p, lexicon):
function main (line 83) | def main(args):
FILE: demo_page.py
function create_download_link (line 36) | def create_download_link():
function scan_checkpoint (line 61) | def scan_checkpoint(cp_dir, prefix, c=8):
function get_models (line 69) | def get_models():
function get_style_embedding (line 105) | def get_style_embedding(prompt, tokenizer, style_encoder):
function tts (line 119) | def tts(name, text, prompt, content, speaker, models):
function new_line (line 157) | def new_line(i):
FILE: demo_page_databaker.py
function create_download_link (line 36) | def create_download_link():
function scan_checkpoint (line 61) | def scan_checkpoint(cp_dir, prefix, c=8):
function get_models (line 69) | def get_models():
function get_style_embedding (line 105) | def get_style_embedding(prompt, tokenizer, style_encoder):
function tts (line 119) | def tts(name, text, prompt, content, speaker, models):
function new_line (line 157) | def new_line(i):
FILE: frontend.py
function g2p_cn_en (line 23) | def g2p_cn_en(text, g2p, lexicon):
function contains_chinese (line 61) | def contains_chinese(text):
FILE: frontend_cn.py
function split_py (line 23) | def split_py(py):
function has_chinese_punctuation (line 77) | def has_chinese_punctuation(text):
function has_english_punctuation (line 80) | def has_english_punctuation(text):
function number_to_chinese (line 86) | def number_to_chinese(number):
function tn_chinese (line 92) | def tn_chinese(text):
function g2p_cn (line 102) | def g2p_cn(text):
FILE: frontend_en.py
function read_lexicon (line 27) | def read_lexicon(lex_path):
function get_eng_phoneme (line 38) | def get_eng_phoneme(text, g2p, lexicon, pad_sos_eos=True):
FILE: inference_am_vocoder_exp.py
function get_style_embedding (line 25) | def get_style_embedding(prompt, tokenizer, style_encoder):
function main (line 40) | def main(args, config):
FILE: inference_am_vocoder_joint.py
function get_style_embedding (line 25) | def get_style_embedding(prompt, tokenizer, style_encoder):
function main (line 40) | def main(args, config):
FILE: inference_tts.py
function get_style_embedding (line 31) | def get_style_embedding(prompt, tokenizer, style_encoder):
function main (line 46) | def main(args, config, gpu_id, start_idx, chunk_num):
FILE: mel_process.py
function dynamic_range_compression_torch (line 19) | def dynamic_range_compression_torch(x, C=1, clip_val=1e-5):
function dynamic_range_decompression_torch (line 24) | def dynamic_range_decompression_torch(x, C=1):
function spectral_normalize_torch (line 29) | def spectral_normalize_torch(magnitudes):
function spectral_de_normalize_torch (line 34) | def spectral_de_normalize_torch(magnitudes):
function spectrogram_torch (line 43) | def spectrogram_torch(y, n_fft, sampling_rate, hop_size, win_size, cente...
function spec_to_mel_torch (line 65) | def spec_to_mel_torch(spec, n_fft, num_mels, sampling_rate, fmin, fmax):
function mel_spectrogram_torch (line 77) | def mel_spectrogram_torch(y, n_fft, num_mels, sampling_rate, hop_size, w...
FILE: mfa/step1_create_dataset.py
function main (line 8) | def main(args):
FILE: mfa/step2_prepare_data.py
function get_args (line 9) | def get_args():
function save_scp_files (line 20) | def save_scp_files(wav_scp_path: os.PathLike, speaker_scp_path: os.PathL...
function main (line 38) | def main(args):
FILE: mfa/step3_prepare_special_tokens.py
function get_args (line 4) | def get_args():
function main (line 11) | def main(args):
FILE: mfa/step4_convert_text_to_phn.py
function get_args (line 21) | def get_args():
function main (line 31) | def main(args):
FILE: mfa/step5_prepare_alignment.py
function get_args (line 10) | def get_args():
function main (line 32) | def main(args):
FILE: mfa/step7_gen_alignment_from_textgrid.py
function readtg (line 32) | def readtg(tg_path):
function insert_special_tokens (line 63) | def insert_special_tokens(seq1: List[str], seq2: List[str],
function get_args (line 129) | def get_args():
function main (line 165) | def main(args):
FILE: mfa/step8_make_data_list.py
function read_lists (line 19) | def read_lists(list_file):
function get_args (line 26) | def get_args():
function main (line 39) | def main(args):
FILE: mfa/step9_datalist_from_mfa.py
function main (line 8) | def main(args):
FILE: models/hifigan/dataset.py
function get_mel (line 26) | def get_mel(filename, stft, sampling_rate, trim=False):
function pad_mel (line 48) | def pad_mel(data, downsample_ratio, max_len ):
class DatasetTTS (line 60) | class DatasetTTS(torch.utils.data.Dataset):
method __init__ (line 61) | def __init__(self, data_path, config):
method load_files (line 77) | def load_files(self, data_path):
method __len__ (line 83) | def __len__(self):
method __getitem__ (line 86) | def __getitem__(self, index):
method TextMelCollate (line 100) | def TextMelCollate(self, data):
FILE: models/hifigan/env.py
class AttrDict (line 9) | class AttrDict(dict):
method __init__ (line 10) | def __init__(self, *args, **kwargs):
function build_env (line 15) | def build_env(config, config_name, path):
FILE: models/hifigan/get_random_segments.py
function get_random_segments (line 8) | def get_random_segments( x: torch.Tensor, x_lengths: torch.Tensor, segme...
function get_segments (line 19) | def get_segments( x: torch.Tensor, start_idxs: torch.Tensor, segment_siz...
FILE: models/hifigan/get_vocoder.py
function vocoder (line 21) | def vocoder(hifi_gan_path, hifi_gan_name):
function vocoder2 (line 39) | def vocoder2(config,hifi_gan_ckpt_path):
function vocoder_inference (line 52) | def vocoder_inference(vocoder, melspec, max_db, min_db):
FILE: models/hifigan/models.py
function init_weights (line 18) | def init_weights(m, mean=0.0, std=0.01):
function get_padding (line 23) | def get_padding(kernel_size, dilation=1):
class ResBlock1 (line 26) | class ResBlock1(torch.nn.Module):
method __init__ (line 27) | def __init__(self, h, channels, kernel_size=3, dilation=(1, 3, 5)):
method forward (line 50) | def forward(self, x):
method remove_weight_norm (line 59) | def remove_weight_norm(self):
class ResBlock2 (line 66) | class ResBlock2(torch.nn.Module):
method __init__ (line 67) | def __init__(self, h, channels, kernel_size=3, dilation=(1, 3)):
method forward (line 78) | def forward(self, x):
method remove_weight_norm (line 85) | def remove_weight_norm(self):
class Generator (line 90) | class Generator(torch.nn.Module):
method __init__ (line 91) | def __init__(self, h):
method forward (line 115) | def forward(self, x):
method remove_weight_norm (line 133) | def remove_weight_norm(self):
class DiscriminatorP (line 143) | class DiscriminatorP(torch.nn.Module):
method __init__ (line 144) | def __init__(self, period, kernel_size=5, stride=3, use_spectral_norm=...
method forward (line 157) | def forward(self, x):
class MultiPeriodDiscriminator (line 179) | class MultiPeriodDiscriminator(torch.nn.Module):
method __init__ (line 180) | def __init__(self):
method forward (line 190) | def forward(self, y, y_hat):
class DiscriminatorS (line 206) | class DiscriminatorS(torch.nn.Module):
method __init__ (line 207) | def __init__(self, use_spectral_norm=False):
method forward (line 221) | def forward(self, x):
class MultiScaleDiscriminator (line 234) | class MultiScaleDiscriminator(torch.nn.Module):
method __init__ (line 235) | def __init__(self):
method forward (line 247) | def forward(self, y, y_hat):
class Discriminator (line 266) | class Discriminator(nn.Module):
method __init__ (line 267) | def __init__(self, config) -> None:
method forward (line 273) | def forward(self, y, y_hat):
function feature_loss (line 279) | def feature_loss(fmap_r, fmap_g):
function discriminator_loss (line 288) | def discriminator_loss(disc_real_outputs, disc_generated_outputs):
function generator_loss (line 302) | def generator_loss(disc_outputs):
FILE: models/hifigan/pretrained_discriminator.py
class Discriminator (line 21) | class Discriminator(nn.Module):
method __init__ (line 22) | def __init__(self, config) -> None:
method forward (line 33) | def forward(self, y, y_hat):
FILE: models/prompt_tts_modified/audio_processing.py
function window_sumsquare (line 11) | def window_sumsquare(window,
function griffin_lim (line 36) | def griffin_lim(magnitudes, stft_fn, n_iters=30):
function dynamic_range_compression (line 50) | def dynamic_range_compression(x, C=1, clip_val=1e-5):
function dynamic_range_decompression (line 54) | def dynamic_range_decompression(x, C=1):
FILE: models/prompt_tts_modified/feats.py
class LogMelFBank (line 21) | class LogMelFBank():
method __init__ (line 23) | def __init__(self,
method _create_mel_filter (line 48) | def _create_mel_filter(self):
method _stft (line 56) | def _stft(self, wav):
method _spectrogram (line 66) | def _spectrogram(self, wav):
method _mel_spectrogram (line 70) | def _mel_spectrogram(self, wav):
method get_log_mel_fbank (line 75) | def get_log_mel_fbank(self, wav):
class Pitch (line 83) | class Pitch():
method __init__ (line 85) | def __init__(self, sr=24000, hop_length=300, pitch_min=80, pitch_max=7...
method _convert_to_continuous_pitch (line 92) | def _convert_to_continuous_pitch(self, pitch: np.array) -> np.array:
method _calculate_pitch (line 114) | def _calculate_pitch(self,
method _average_by_duration (line 132) | def _average_by_duration(self, input: np.array, d: np.array) -> np.array:
method get_pitch (line 147) | def get_pitch(self,
class Energy (line 159) | class Energy():
method __init__ (line 161) | def __init__(self,
method _stft (line 178) | def _stft(self, wav):
method _calculate_energy (line 188) | def _calculate_energy(self, input):
method _average_by_duration (line 198) | def _average_by_duration(self, input: np.array, d: np.array) -> np.array:
method get_energy (line 209) | def get_energy(self, wav, use_token_averaged_energy=True, duration=None):
function window_sumsquare (line 216) | def window_sumsquare(window,
function griffin_lim (line 241) | def griffin_lim(magnitudes, stft_fn, n_iters=30):
function dynamic_range_compression (line 261) | def dynamic_range_compression(x, C=1, clip_val=1e-5):
function dynamic_range_decompression (line 270) | def dynamic_range_decompression(x, C=1):
class STFT (line 281) | class STFT(torch.nn.Module):
method __init__ (line 282) | def __init__(self, filter_length=800, hop_length=200, win_length=800,
method transform (line 315) | def transform(self, input_data):
method inverse (line 345) | def inverse(self, magnitude, phase):
method forward (line 376) | def forward(self, input_data):
class TacotronSTFT (line 381) | class TacotronSTFT(torch.nn.Module):
method __init__ (line 382) | def __init__(self, filter_length=1024, hop_length=256, win_length=1024,
method spectral_normalize (line 398) | def spectral_normalize(self, magnitudes):
method spectral_de_normalize (line 402) | def spectral_de_normalize(self, magnitudes):
method mel_spectrogram (line 406) | def mel_spectrogram(self, y):
FILE: models/prompt_tts_modified/jets.py
class JETSGenerator (line 26) | class JETSGenerator(nn.Module):
method __init__ (line 27) | def __init__(self, config) -> None:
method forward (line 50) | def forward(self, inputs_ling, input_lengths, inputs_speaker, inputs_s...
FILE: models/prompt_tts_modified/loss.py
function get_mask_from_lengths (line 10) | def get_mask_from_lengths(lengths, max_len=None):
class MelReconLoss (line 22) | class MelReconLoss(torch.nn.Module):
method __init__ (line 23) | def __init__(self, loss_type="mae"):
method forward (line 33) | def forward(self, output_lengths, mel_targets, dec_outputs, postnet_ou...
class ForwardSumLoss (line 59) | class ForwardSumLoss(torch.nn.Module):
method __init__ (line 61) | def __init__(self):
method forward (line 64) | def forward(
class ProsodyReconLoss (line 99) | class ProsodyReconLoss(torch.nn.Module):
method __init__ (line 100) | def __init__(self, loss_type="mae"):
method forward (line 110) | def forward(
class TTSLoss (line 147) | class TTSLoss(torch.nn.Module):
method __init__ (line 148) | def __init__(self, loss_type="mae") -> None:
method forward (line 155) | def forward(self, outputs):
FILE: models/prompt_tts_modified/model_open_source.py
class PromptTTS (line 14) | class PromptTTS(nn.Module):
method __init__ (line 15) | def __init__(self, config) -> None:
method forward (line 102) | def forward(self, inputs_ling, input_lengths, inputs_speaker, inputs_s...
method get_mask_from_lengths (line 164) | def get_mask_from_lengths(self, lengths: torch.Tensor) -> torch.Tensor:
method average_utterance_prosody (line 174) | def average_utterance_prosody(
method load_my_state_dict (line 180) | def load_my_state_dict(self, state_dict):
method make_pad_mask (line 194) | def make_pad_mask(self, lengths, max_len=None):
method make_non_pad_mask (line 206) | def make_non_pad_mask(self, length, max_len=None):
FILE: models/prompt_tts_modified/modules/alignment.py
class AlignmentModule (line 13) | class AlignmentModule(nn.Module):
method __init__ (line 15) | def __init__(self, adim, odim, cache_prior=True):
method forward (line 27) | def forward(self, text, feats, text_lengths, feats_lengths, x_masks=No...
method _generate_prior (line 59) | def _generate_prior(self, text_lengths, feats_lengths, w=1) -> torch.T...
function _monotonic_alignment_search (line 93) | def _monotonic_alignment_search(log_p_attn):
function viterbi_decode (line 125) | def viterbi_decode(log_p_attn, text_lengths, feats_lengths):
function _average_by_duration (line 146) | def _average_by_duration(ds, xs, text_lengths, feats_lengths):
function average_by_duration (line 165) | def average_by_duration(ds, xs, text_lengths, feats_lengths):
class GaussianUpsampling (line 175) | class GaussianUpsampling(torch.nn.Module):
method __init__ (line 177) | def __init__(self, delta=0.1):
method forward (line 180) | def forward(self, hs, ds, h_masks=None, d_masks=None, alpha=1.0):
FILE: models/prompt_tts_modified/modules/encoder.py
class MultiSequential (line 10) | class MultiSequential(torch.nn.Sequential):
method __init__ (line 13) | def __init__(self, *args, layer_drop_rate=0.0):
method forward (line 18) | def forward(self, *args):
function repeat (line 27) | def repeat(N, fn, layer_drop_rate=0.0):
class MultiLayeredConv1d (line 31) | class MultiLayeredConv1d(torch.nn.Module):
method __init__ (line 32) | def __init__(self, in_chans, hidden_chans, kernel_size, dropout_rate):
method forward (line 50) | def forward(self, x):
class MultiHeadedAttention (line 55) | class MultiHeadedAttention(nn.Module):
method __init__ (line 58) | def __init__(self, n_head, n_feat, dropout_rate):
method forward_qkv (line 72) | def forward_qkv(self, query, key, value):
method forward_attention (line 84) | def forward_attention(self, value, scores, mask):
method forward (line 105) | def forward(self, query, key, value, mask):
class LayerNorm (line 112) | class LayerNorm(torch.nn.LayerNorm):
method __init__ (line 114) | def __init__(self, nout, dim=-1):
method forward (line 119) | def forward(self, x):
class EncoderLayer (line 129) | class EncoderLayer(nn.Module):
method __init__ (line 130) | def __init__(
method forward (line 154) | def forward(self, x, mask, cache=None):
class PositionalEncoding (line 204) | class PositionalEncoding(torch.nn.Module):
method __init__ (line 206) | def __init__(self, d_model, dropout_rate, max_len=5000, reverse=False):
method extend_pe (line 216) | def extend_pe(self, x):
method forward (line 239) | def forward(self, x: torch.Tensor):
class ScaledPositionalEncoding (line 246) | class ScaledPositionalEncoding(PositionalEncoding):
method __init__ (line 248) | def __init__(self, d_model, dropout_rate, max_len=5000):
method reset_parameters (line 253) | def reset_parameters(self):
method forward (line 257) | def forward(self, x):
class Encoder (line 263) | class Encoder(torch.nn.Module):
method __init__ (line 264) | def __init__(
method forward (line 316) | def forward(self, xs, masks):
FILE: models/prompt_tts_modified/modules/initialize.py
function initialize (line 11) | def initialize(model: torch.nn.Module, init: str):
FILE: models/prompt_tts_modified/modules/variance.py
class DurationPredictor (line 9) | class DurationPredictor(torch.nn.Module):
method __init__ (line 11) | def __init__(
method _forward (line 36) | def _forward(self, xs, x_masks=None, is_inference=False):
method forward (line 58) | def forward(self, xs, x_masks=None):
method inference (line 62) | def inference(self, xs, x_masks=None):
class VariancePredictor (line 68) | class VariancePredictor(torch.nn.Module):
method __init__ (line 71) | def __init__(
method forward (line 101) | def forward(self, xs: torch.Tensor, x_masks: torch.Tensor = None) -> t...
FILE: models/prompt_tts_modified/prompt_dataset.py
function get_mel (line 29) | def get_mel(filename, stft, sampling_rate, trim=False):
function pad_mel (line 51) | def pad_mel(data, downsample_ratio, max_len ):
class Dataset_PromptTTS (line 63) | class Dataset_PromptTTS(torch.utils.data.Dataset):
method __init__ (line 64) | def __init__(self, data_path, config, style_encoder):
method get_style_embedding (line 106) | def get_style_embedding(self, uttid, prompt, dir):
method load_files (line 125) | def load_files(self, data_path):
method get_pitch (line 130) | def get_pitch(self, wav, pitch_stats):
method get_energy (line 137) | def get_energy(self, wav, energy_stats):
method __len__ (line 144) | def __len__(self):
method __getitem__ (line 147) | def __getitem__(self, index):
method TextMelCollate (line 179) | def TextMelCollate(self, data):
class Dataset_Prompt_Pretrain (line 246) | class Dataset_Prompt_Pretrain(torch.utils.data.Dataset):
method __init__ (line 247) | def __init__(self, data_path, config):
method load_files (line 265) | def load_files(self, data_path):
method __len__ (line 270) | def __len__(self):
method __getitem__ (line 273) | def __getitem__(self, index):
method TextMelCollate (line 292) | def TextMelCollate(self, data):
FILE: models/prompt_tts_modified/scheduler.py
class FindLR (line 8) | class FindLR(_LRScheduler):
method __init__ (line 11) | def __init__(self, optimizer, max_steps, max_lr=10):
method get_lr (line 16) | def get_lr(self):
class NoamLR (line 24) | class NoamLR(_LRScheduler):
method __init__ (line 25) | def __init__(self, optimizer, warmup_steps):
method get_lr (line 29) | def get_lr(self):
FILE: models/prompt_tts_modified/simbert.py
class ClassificationHead (line 21) | class ClassificationHead(nn.Module):
method __init__ (line 22) | def __init__(self, hidden_size, num_labels, dropout_rate=0.1) -> None:
method forward (line 29) | def forward(self, pooled_output):
class StyleEncoder (line 33) | class StyleEncoder(nn.Module):
method __init__ (line 34) | def __init__(self, config) -> None:
method forward (line 48) | def forward(self, input_ids, token_type_ids, attention_mask):
class StylePretrainLoss (line 76) | class StylePretrainLoss(nn.Module):
method __init__ (line 77) | def __init__(self) -> None:
method forward (line 82) | def forward(self, inputs, outputs):
class StylePretrainLoss2 (line 97) | class StylePretrainLoss2(StylePretrainLoss):
method __init__ (line 98) | def __init__(self) -> None:
method forward (line 103) | def forward(self, inputs, outputs):
function flat_accuracy (line 109) | def flat_accuracy(preds, labels):
FILE: models/prompt_tts_modified/stft.py
class STFT (line 14) | class STFT(torch.nn.Module):
method __init__ (line 15) | def __init__(self, filter_length=800, hop_length=200, win_length=800,
method transform (line 48) | def transform(self, input_data):
method inverse (line 78) | def inverse(self, magnitude, phase):
method forward (line 109) | def forward(self, input_data):
FILE: models/prompt_tts_modified/style_encoder.py
class LearnedDownSample (line 11) | class LearnedDownSample(nn.Module):
method __init__ (line 12) | def __init__(self, layer_type, dim_in):
method forward (line 25) | def forward(self, x):
class LearnedUpSample (line 28) | class LearnedUpSample(nn.Module):
method __init__ (line 29) | def __init__(self, layer_type, dim_in):
method forward (line 43) | def forward(self, x):
class DownSample (line 46) | class DownSample(nn.Module):
method __init__ (line 47) | def __init__(self, layer_type):
method forward (line 51) | def forward(self, x):
class UpSample (line 64) | class UpSample(nn.Module):
method __init__ (line 65) | def __init__(self, layer_type):
method forward (line 69) | def forward(self, x):
class ResBlk (line 80) | class ResBlk(nn.Module):
method __init__ (line 81) | def __init__(self, dim_in, dim_out, actv=nn.LeakyReLU(0.2),
method _build_weights (line 91) | def _build_weights(self, dim_in, dim_out):
method _shortcut (line 100) | def _shortcut(self, x):
method _residual (line 107) | def _residual(self, x):
method forward (line 119) | def forward(self, x):
class StyleEncoder (line 123) | class StyleEncoder(nn.Module):
method __init__ (line 124) | def __init__(self, dim_in=48, style_dim=48, max_conv_dim=384):
method forward (line 143) | def forward(self, x):
class CosineSimilarityLoss (line 151) | class CosineSimilarityLoss(nn.Module):
method __init__ (line 152) | def __init__(self) -> None:
method forward (line 157) | def forward(self, output1, output2):
FILE: models/prompt_tts_modified/tacotron_stft.py
class LinearNorm (line 12) | class LinearNorm(torch.nn.Module):
method __init__ (line 13) | def __init__(self, in_dim, out_dim, bias=True, w_init_gain='linear'):
method forward (line 21) | def forward(self, x):
class ConvNorm (line 25) | class ConvNorm(torch.nn.Module):
method __init__ (line 26) | def __init__(self, in_channels, out_channels, kernel_size=1, stride=1,
method forward (line 41) | def forward(self, signal):
class TacotronSTFT (line 46) | class TacotronSTFT(torch.nn.Module):
method __init__ (line 47) | def __init__(self, filter_length=1024, hop_length=256, win_length=1024,
method spectral_normalize (line 63) | def spectral_normalize(self, magnitudes):
method spectral_de_normalize (line 67) | def spectral_de_normalize(self, magnitudes):
method mel_spectrogram (line 71) | def mel_spectrogram(self, y):
FILE: openaiapi.py
function get_env (line 32) | def get_env(key):
function get_int_env (line 36) | def get_int_env(key):
function get_float_env (line 40) | def get_float_env(key):
function get_bool_env (line 44) | def get_bool_env(key):
function scan_checkpoint (line 48) | def scan_checkpoint(cp_dir, prefix, c=8):
function get_models (line 56) | def get_models():
function get_style_embedding (line 95) | def get_style_embedding(prompt, tokenizer, style_encoder):
function emotivoice_tts (line 110) | def emotivoice_tts(text, prompt, content, speaker, models):
class SpeechRequest (line 152) | class SpeechRequest(BaseModel):
function text_to_speech (line 163) | def text_to_speech(speechRequest: SpeechRequest):
FILE: plot_image.py
function plot_image_sambert (line 6) | def plot_image_sambert(target, melspec, mel_lengths=None, text_lengths=N...
FILE: predict.py
function scan_checkpoint (line 57) | def scan_checkpoint(cp_dir, prefix, c=8):
function g2p_en (line 64) | def g2p_en(text):
function contains_chinese (line 67) | def contains_chinese(text):
function download_json (line 72) | def download_json(url: str, dest: Path):
function download_weights (line 80) | def download_weights(baseurl: str, basedest: str, files: List[str]):
class Predictor (line 99) | class Predictor(BasePredictor):
method setup_models (line 101) | def setup_models(self):
method setup (line 138) | def setup(self) -> None:
method get_style_embedding (line 148) | def get_style_embedding(self, text):
method tts (line 164) | def tts(self, text, prompt, content, speaker):
method predict (line 196) | def predict(
FILE: prepare_for_training.py
function main (line 21) | def main(args):
function prepare_info (line 38) | def prepare_info(data_dir, info_dir):
function prepare_config (line 69) | def prepare_config(data_dir, info_dir, exp_dir, config_dir):
function prepare_ckpt (line 80) | def prepare_ckpt(data_dir, info_dir, ckpt_dir):
FILE: text/__init__.py
function text_to_sequence (line 18) | def text_to_sequence(text, cleaner_names):
function sequence_to_text (line 49) | def sequence_to_text(sequence):
function _clean_text (line 62) | def _clean_text(text, cleaner_names):
function _symbols_to_sequence (line 71) | def _symbols_to_sequence(symbols):
function _arpabet_to_sequence (line 75) | def _arpabet_to_sequence(text):
function _should_keep_symbol (line 79) | def _should_keep_symbol(s):
FILE: text/cleaners.py
function expand_abbreviations (line 47) | def expand_abbreviations(text):
function expand_numbers (line 53) | def expand_numbers(text):
function lowercase (line 57) | def lowercase(text):
function collapse_whitespace (line 61) | def collapse_whitespace(text):
function convert_to_ascii (line 65) | def convert_to_ascii(text):
function basic_cleaners (line 69) | def basic_cleaners(text):
function transliteration_cleaners (line 76) | def transliteration_cleaners(text):
function english_cleaners (line 84) | def english_cleaners(text):
FILE: text/cmudict.py
class CMUDict (line 98) | class CMUDict:
method __init__ (line 101) | def __init__(self, file_or_path, keep_ambiguous=True):
method __len__ (line 111) | def __len__(self):
method lookup (line 114) | def lookup(self, word):
function _parse_cmudict (line 122) | def _parse_cmudict(file):
function _get_pronunciation (line 137) | def _get_pronunciation(s):
FILE: text/numbers.py
function _remove_commas (line 18) | def _remove_commas(m):
function _expand_decimal_point (line 22) | def _expand_decimal_point(m):
function _expand_dollars (line 26) | def _expand_dollars(m):
function _expand_ordinal (line 47) | def _expand_ordinal(m):
function _expand_number (line 51) | def _expand_number(m):
function normalize_numbers (line 68) | def normalize_numbers(text):
FILE: train_am_vocoder_joint.py
function count_parameters (line 24) | def count_parameters(model):
function get_writer (line 27) | def get_writer(output_directory):
function save_checkpoint (line 34) | def save_checkpoint(filepath, obj):
function scan_checkpoint (line 40) | def scan_checkpoint(cp_dir, prefix):
function load_checkpoint (line 47) | def load_checkpoint(filepath, device):
function validate (line 57) | def validate(args, generator, val_loader, iteration, writer, config, dev...
function train (line 198) | def train(args, config):
function main (line 461) | def main():
Condensed preview — 85 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (6,384K chars).
[
{
"path": ".dockerignore",
"chars": 315,
"preview": "# The .dockerignore file excludes files from the container build process.\n#\n# https://docs.docker.com/engine/reference/b"
},
{
"path": ".gitignore",
"chars": 55,
"preview": "outputs/\nWangZeJun/\n*.pyc\n.vscode/\n__pycache__/\n.idea/\n"
},
{
"path": "Dockerfile",
"chars": 529,
"preview": "# syntax=docker/dockerfile:1\nFROM ubuntu:22.04\n\n# install app dependencies\nRUN apt-get update && apt-get install -y pyth"
},
{
"path": "HTTP_API_TtsDemo/README.md",
"chars": 388,
"preview": "# 说明\r\n项目为有道智云paas接口的python语言调用示例。您可以通过执行项目中的main函数快速调用有道智云相关api服务。\r\n\r\n# 运行环境\r\n1. python 3.6版本及以上。\r\n\r\n# 运行方式\r\n1. 在执行前您需要根"
},
{
"path": "HTTP_API_TtsDemo/apidemo/TtsDemo.py",
"chars": 1288,
"preview": "import requests\r\n\r\nfrom utils.AuthV3Util import addAuthParams\r\n\r\n# 您的应用ID\r\nAPP_KEY = ''\r\n# 您的应用密钥\r\nAPP_SECRET = ''\r\n\r\n# "
},
{
"path": "HTTP_API_TtsDemo/apidemo/utils/AuthV3Util.py",
"chars": 1423,
"preview": "import hashlib\r\nimport time\r\nimport uuid\r\n\r\n'''\r\n添加鉴权相关参数 -\r\n appKey : 应用ID\r\n salt : 随机值\r\n curtime : 当前时间戳(秒)\r\n"
},
{
"path": "LICENSE",
"chars": 14333,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "README.md",
"chars": 8758,
"preview": "<div align=\"center\">\n<a href=\"https://trendshift.io/repositories/4833\" target=\"_blank\"><img src=\"https://trendshift.io/a"
},
{
"path": "README.zh.md",
"chars": 6043,
"preview": "<font size=4> README: <a href=\"./README.md\">EN</a> | 中文 </font>\n\n\n<div align=\"center\">\n <h1>EmotiVoice易魔声 😊: 多音色提示控制"
},
{
"path": "README_小白安装教程.md",
"chars": 5086,
"preview": "## 小白安装教程\n\n#### 环境条件:设备有GPU、已经安装cuda\n\n说明:这是针对Linux环境安装的教程,其他系统可作为参考。\n\n#### 1、创建并进入conda环境\n\n```\nconda create -n EmotiVoic"
},
{
"path": "ROADMAP.md",
"chars": 1792,
"preview": "# EmotiVoice Roadmap\n\nThis roadmap is for EmotiVoice (易魔声), a project driven by the community. We value your feedback an"
},
{
"path": "cn2an/an2cn.py",
"chars": 7790,
"preview": "\"\"\"\nThis code is modified from https://github.com/Ailln/cn2an.\n\"\"\"\n\nfrom typing import Union\nfrom warnings import warn\n\n"
},
{
"path": "cn2an/conf.py",
"chars": 1705,
"preview": "\"\"\"\nThis code is modified from https://github.com/Ailln/cn2an.\n\"\"\"\n\nNUMBER_CN2AN = {\n \"零\": 0,\n \"〇\": 0,\n \"一\": 1,"
},
{
"path": "cog.yaml",
"chars": 768,
"preview": "# Configuration for Cog ⚙️\n# Reference: https://github.com/replicate/cog/blob/main/docs/yaml.md\n\nbuild:\n gpu: true\n\n #"
},
{
"path": "config/joint/config.py",
"chars": 3613,
"preview": "# Copyright 2023, YOUDAO\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this fil"
},
{
"path": "config/joint/config.yaml",
"chars": 3031,
"preview": "###########################################################\n# FEATURE EXTRACTION SETTING #\n"
},
{
"path": "config/template.py",
"chars": 3726,
"preview": "# Copyright 2023, YOUDAO\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this fil"
},
{
"path": "data/DataBaker/README.md",
"chars": 5952,
"preview": "\n\n# 😊 DataBaker Recipe \n\nThis is the recipe of Chinese single female speaker TTS model with DataBaker corpus.\n\n## Guide "
},
{
"path": "data/DataBaker/src/step0_download.sh",
"chars": 148,
"preview": "\n\n# please download the data from https://en.data-baker.com/datasets/freeDatasets/, and place the extracted BZNSYP folde"
},
{
"path": "data/DataBaker/src/step1_clean_raw_data.py",
"chars": 2916,
"preview": "\"\"\"\nThis code is modified from https://github.com/wenet-e2e/wetts. \n\"\"\"\n\nimport os\nimport argparse\nimport soundfile as s"
},
{
"path": "data/DataBaker/src/step2_get_phoneme.py",
"chars": 6329,
"preview": "# Copyright 2023, YOUDAO\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this fil"
},
{
"path": "data/LJspeech/README.md",
"chars": 5413,
"preview": "\n\n# 😊 LJSpeech Recipe \n\nThis is the recipe of English single female speaker TTS model with LJSpeech corpus.\n\n## Guide Fo"
},
{
"path": "data/LJspeech/src/step0_download.sh",
"chars": 97,
"preview": "\n\n\nwget http://data.keithito.com/data/speech/LJSpeech-1.1.tar.bz2\n\ntar -xjf LJSpeech-1.1.tar.bz2\n"
},
{
"path": "data/LJspeech/src/step1_clean_raw_data.py",
"chars": 1961,
"preview": "# Copyright 2023, YOUDAO\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this fil"
},
{
"path": "data/LJspeech/src/step2_get_phoneme.py",
"chars": 3491,
"preview": "# Copyright 2023, YOUDAO\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this fil"
},
{
"path": "data/inference/text",
"chars": 6136,
"preview": "8051|Happy|<sos/eos> [IH0] [M] [AA1] [T] engsp4 [V] [OY1] [S] engsp4 [AH0] engsp1 [M] [AH1] [L] [T] [IY0] engsp4 [V] [OY"
},
{
"path": "data/youdao/text/README.md",
"chars": 59031,
"preview": "# 😊 voice wiki page\n\n- Speaker info is mainly from [LibriTTS](https://www.openslr.org/60/) and [HiFiTTS](https://www.ope"
},
{
"path": "data/youdao/text/emotion",
"chars": 20,
"preview": "普通\n生气\n开心\n惊讶\n悲伤\n厌恶\n恐惧"
},
{
"path": "data/youdao/text/energy",
"chars": 14,
"preview": "音量普通\n音量很高\n音量很低"
},
{
"path": "data/youdao/text/pitch",
"chars": 14,
"preview": "音调普通\n音调很高\n音调很低"
},
{
"path": "data/youdao/text/speaker2",
"chars": 9714,
"preview": "8051\n11614\n9017\n6097\n6671\n6670\n9136\n11697\n92\n12787\n1006\n1012\n1018\n101\n1025\n1027\n1028\n102\n1034\n103\n1040\n1046\n1049\n104\n105"
},
{
"path": "data/youdao/text/speed",
"chars": 14,
"preview": "语速普通\n语速很快\n语速很慢"
},
{
"path": "data/youdao/text/tokenlist",
"chars": 2819,
"preview": "_\n<sos/eos>\n[AA0]\n[AA1]\n[AA2]\n[AE0]\n[AE1]\n[AE2]\n[AH0]\n[AH1]\n[AH2]\n[AO0]\n[AO1]\n[AO2]\n[AW0]\n[AW1]\n[AW2]\n[AY0]\n[AY1]\n[AY2]\n"
},
{
"path": "demo_page.py",
"chars": 6486,
"preview": "# Copyright 2023, YOUDAO\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this fil"
},
{
"path": "demo_page_databaker.py",
"chars": 6341,
"preview": "# Copyright 2023, YOUDAO\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this fil"
},
{
"path": "frontend.py",
"chars": 3080,
"preview": "# Copyright 2023, YOUDAO\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this fil"
},
{
"path": "frontend_cn.py",
"chars": 4277,
"preview": "# Copyright 2023, YOUDAO\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this fil"
},
{
"path": "frontend_en.py",
"chars": 2864,
"preview": "# Copyright 2023, YOUDAO\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this fil"
},
{
"path": "inference_am_vocoder_exp.py",
"chars": 6086,
"preview": "# Copyright 2023, YOUDAO\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this fil"
},
{
"path": "inference_am_vocoder_joint.py",
"chars": 6161,
"preview": "# Copyright 2023, YOUDAO\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this fil"
},
{
"path": "inference_tts.py",
"chars": 8601,
"preview": "# Copyright 2023, YOUDAO\n# 2024, Du Jing(thuduj12@163.com)\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "lexicon/librispeech-lexicon.txt",
"chars": 5627653,
"preview": "A AH0\nA EY1\nA''S\tEY1 Z\nA'BODY\tEY1 B AA2 D IY0\nA'COURT\tEY1 K AO2 R T\nA'D\tEY1 D\nA'GHA\tEY1 G AH0\nA'GOIN\tEY1 G OY1 N\nA'LL\t"
},
{
"path": "mel_process.py",
"chars": 3803,
"preview": "import math\nimport os\nimport random\nimport torch\nfrom torch import nn\nimport torch.nn.functional as F\nimport torch.utils"
},
{
"path": "mfa/step1_create_dataset.py",
"chars": 1209,
"preview": "\nfrom tqdm import tqdm \nimport jsonlines\nimport re\nimport argparse\nimport os\n\ndef main(args):\n ROOT_DIR=os.path.abspa"
},
{
"path": "mfa/step2_prepare_data.py",
"chars": 2631,
"preview": "\nimport argparse\nimport collections\nimport pathlib\nimport os\nfrom typing import Iterable\nfrom tqdm import tqdm\n\ndef get_"
},
{
"path": "mfa/step3_prepare_special_tokens.py",
"chars": 540,
"preview": "import argparse\n\n\ndef get_args():\n parser = argparse.ArgumentParser()\n parser.add_argument('--special_tokens',\n "
},
{
"path": "mfa/step4_convert_text_to_phn.py",
"chars": 1874,
"preview": "# Copyright (c) 2022 Tsinghua University. (authors: Jie Chen)\n#\n# Licensed under the Apache License, Version 2.0 (the \"L"
},
{
"path": "mfa/step5_prepare_alignment.py",
"chars": 2948,
"preview": "#!/usr/bin/env python\n# Copyright 2022 Binbin Zhang(binbzha@qq.com), Jie Chen(unrea1sama@outlook.com)\n\"\"\"Generate lab fi"
},
{
"path": "mfa/step7_gen_alignment_from_textgrid.py",
"chars": 9988,
"preview": "#!/usr/bin/env python3\n# Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved.\n# 2022 Binbin Zhang"
},
{
"path": "mfa/step8_make_data_list.py",
"chars": 2056,
"preview": "# Copyright (c) 2022 Tsinghua University(Jie Chen)\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n#"
},
{
"path": "mfa/step9_datalist_from_mfa.py",
"chars": 1805,
"preview": "\n\nimport jsonlines\nimport argparse\nimport os\n\n\ndef main(args):\n ROOT_DIR=os.path.abspath(args.data_dir)\n TEXT_DIR="
},
{
"path": "models/hifigan/dataset.py",
"chars": 3797,
"preview": "# Copyright 2023, YOUDAO\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this fil"
},
{
"path": "models/hifigan/env.py",
"chars": 445,
"preview": "\"\"\" \nfrom https://github.com/jik876/hifi-gan \n\"\"\"\n\nimport os\nimport shutil\n\n\nclass AttrDict(dict):\n def __init__(self"
},
{
"path": "models/hifigan/get_random_segments.py",
"chars": 908,
"preview": "\"\"\" \nfrom https://github.com/espnet/espnet \n\"\"\"\n\nimport torch\n\n\ndef get_random_segments( x: torch.Tensor, x_lengths: tor"
},
{
"path": "models/hifigan/get_vocoder.py",
"chars": 1926,
"preview": "# Copyright 2023, YOUDAO\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this fil"
},
{
"path": "models/hifigan/models.py",
"chars": 10774,
"preview": "\"\"\"\nThis code is modified from https://github.com/jik876/hifi-gan.\n\"\"\"\n\n\nimport torch\nimport torch.nn.functional as F\nim"
},
{
"path": "models/hifigan/pretrained_discriminator.py",
"chars": 1485,
"preview": "# Copyright 2023, YOUDAO\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this fil"
},
{
"path": "models/prompt_tts_modified/audio_processing.py",
"chars": 1566,
"preview": "\"\"\" \nfrom https://github.com/espnet/espnet \n\"\"\"\n\nimport torch\nimport numpy as np\nfrom scipy.signal import get_window\nimp"
},
{
"path": "models/prompt_tts_modified/feats.py",
"chars": 14140,
"preview": "\"\"\" \nThis code is modified from https://github.com/wenet-e2e/wetts. \n\"\"\"\n\nimport librosa\nimport numpy as np\nimport pywor"
},
{
"path": "models/prompt_tts_modified/jets.py",
"chars": 2717,
"preview": "# Copyright 2023, YOUDAO\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this fil"
},
{
"path": "models/prompt_tts_modified/loss.py",
"chars": 6292,
"preview": "\"\"\"\nThis code is modified from https://github.com/alibaba-damo-academy/KAN-TTS.\n\"\"\"\n\nimport torch\nimport torch.nn as nn\n"
},
{
"path": "models/prompt_tts_modified/model_open_source.py",
"chars": 9346,
"preview": "\"\"\"\nThis code is modified from https://github.com/espnet/espnet.\n\"\"\"\n\nimport torch\nimport torch.nn as nn\n\n\nfrom models.p"
},
{
"path": "models/prompt_tts_modified/modules/alignment.py",
"chars": 6670,
"preview": "\"\"\" \nThis code is modified from https://github.com/espnet/espnet. \n\"\"\"\n\nimport numpy as np\nimport torch\nimport torch.nn "
},
{
"path": "models/prompt_tts_modified/modules/encoder.py",
"chars": 10312,
"preview": "\"\"\"\nThis code is modified from https://github.com/espnet/espnet.\n\"\"\"\n\nimport torch\nimport math\nfrom torch import nn\nimpo"
},
{
"path": "models/prompt_tts_modified/modules/initialize.py",
"chars": 1796,
"preview": "\"\"\"\nThis code is modified from https://github.com/espnet/espnet.\n\"\"\"\n\nimport torch\nimport torch.nn as nn\nimport torch.nn"
},
{
"path": "models/prompt_tts_modified/modules/variance.py",
"chars": 3665,
"preview": "\"\"\"\nThis code is modified from https://github.com/espnet/espnet.\n\"\"\"\n\nimport torch \n\nfrom models.prompt_tts_modified.mod"
},
{
"path": "models/prompt_tts_modified/prompt_dataset.py",
"chars": 11689,
"preview": "# Copyright 2023, YOUDAO\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this fil"
},
{
"path": "models/prompt_tts_modified/scheduler.py",
"chars": 977,
"preview": "\"\"\"\nThis code is modified from https://github.com/alibaba-damo-academy/KAN-TTS.\n\"\"\"\n\nfrom torch.optim.lr_scheduler impor"
},
{
"path": "models/prompt_tts_modified/simbert.py",
"chars": 3940,
"preview": "# Copyright 2023, YOUDAO\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this fil"
},
{
"path": "models/prompt_tts_modified/stft.py",
"chars": 4397,
"preview": "\"\"\" \nThis code is modified from https://github.com/pseeth/pytorch-stft. \n\"\"\"\n\nimport torch\nimport numpy as np\nimport tor"
},
{
"path": "models/prompt_tts_modified/style_encoder.py",
"chars": 5693,
"preview": "\"\"\"\nThis code is modified from https://github.com/yl4579/StyleTTS.\n\"\"\"\nimport torch\nimport torch.nn as nn\nimport torch.n"
},
{
"path": "models/prompt_tts_modified/tacotron_stft.py",
"chars": 2920,
"preview": "\"\"\"\nfrom https://github.com/NVIDIA/tacotron2\n\"\"\"\n\nimport torch\nfrom librosa.filters import mel as librosa_mel_fn\nfrom mo"
},
{
"path": "openaiapi.py",
"chars": 5774,
"preview": "import logging\nimport os\nimport io\nimport torch\nimport glob\n\nfrom fastapi import FastAPI, Response\nfrom pydantic import "
},
{
"path": "plot_image.py",
"chars": 813,
"preview": "import matplotlib.pyplot as plt\nimport torch.nn.functional as F\n\nimport os\n\ndef plot_image_sambert(target, melspec, mel_"
},
{
"path": "predict.py",
"chars": 8343,
"preview": "# Prediction interface for Cog ⚙️DEVICE\n# https://github.com/replicate/cog/blob/main/docs/python.md\n\nfrom cog import Bas"
},
{
"path": "prepare_for_training.py",
"chars": 3749,
"preview": "# Copyright 2023, YOUDAO\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this fil"
},
{
"path": "requirements.openaiapi.txt",
"chars": 62,
"preview": "fastapi\npython-multipart\nuvicorn[standard]\npydub\npyrubberband\n"
},
{
"path": "requirements.txt",
"chars": 109,
"preview": "torch\ntorchaudio\nnumpy\nnumba\nscipy\ntransformers\nsoundfile\nyacs\ng2p_en\njieba\npypinyin\npypinyin_dict\nstreamlit\n"
},
{
"path": "setup.py",
"chars": 2795,
"preview": "import os\n\nfrom setuptools import find_packages, setup\n\nrequirements={\n \"infer\": [\n \"numpy>=1.24.3\",\n \""
},
{
"path": "text/__init__.py",
"chars": 2284,
"preview": "\"\"\"\nfrom https://github.com/keithito/tacotron \n\"\"\"\n\nimport re\nfrom text import cleaners\nfrom text.symbols import symbols"
},
{
"path": "text/cleaners.py",
"chars": 2524,
"preview": "\"\"\" \nfrom https://github.com/keithito/tacotron \n\"\"\"\n\n'''\nCleaners are transformations that run over the input text at bo"
},
{
"path": "text/cmudict.py",
"chars": 2450,
"preview": "\"\"\" \nfrom https://github.com/keithito/tacotron \n\"\"\"\n\nimport re\n\n\nvalid_symbols = [\n \"AA\",\n \"AA0\",\n \"AA1\",\n \""
},
{
"path": "text/numbers.py",
"chars": 2323,
"preview": "\"\"\" \nfrom https://github.com/keithito/tacotron \n\"\"\"\n\nimport inflect\nimport re\n\n\n_inflect = inflect.engine()\n_comma_numbe"
},
{
"path": "text/symbols.py",
"chars": 793,
"preview": "\"\"\" \nfrom https://github.com/keithito/tacotron \n\"\"\"\n\n\"\"\"\nDefines the set of symbols used in text input to the model.\n\nTh"
},
{
"path": "train_am_vocoder_joint.py",
"chars": 19615,
"preview": "import argparse, time\nimport sys\nimport os\nimport torch, glob, itertools\nfrom yacs import config as CONFIG\n\nfrom torch.u"
}
]
About this extraction
This page contains the full source code of the netease-youdao/EmotiVoice GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 85 files (5.7 MB), approximately 1.5M tokens, and a symbol index with 380 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.