Merge pull request #647 from PaddlePaddle/doc

remove useless doc
pull/648/head
Hui Zhang 4 years ago committed by GitHub
commit 9e2dac666d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

@ -1,20 +0,0 @@
# Alignment
我们首先从建模的角度理解一下对齐。语音识别任务,需要对输入音频序列 X = [x1x2x3...xt...xT] (通常是 fbank 或 mfcc 等音频特征)和输出的标注数据文本序列 Y = [y1y2y3...yu...yU] 关系进行建模,其中 X 的长度一般大于 Y 的长度。如果能够知道yu和xt的对应关系就可以将这类任务变成语音帧级别上的分类任务即对每个时刻 xt 进行分类得到 yu。
## MFA
## CTC Alignment
## Reference
* [ctc alignment](https://mp.weixin.qq.com/s/4aGehNN7PpIvCh03qTT5oA)
* [时间戳和N-Best](https://mp.weixin.qq.com/s?__biz=MzU2NjUwMTgxOQ==&mid=2247483956&idx=1&sn=80ce595238d84155d50f08c0d52267d3&chksm=fcaacae0cbdd43f62b1da60c8e8671a9e0bb2aeee94f58751839b03a1c45b9a3889b96705080&scene=21#wechat_redirect)

@ -1,101 +0,0 @@
# ASR Text Backend
1. [Text Segmentation](text_front_end#text segmentation)
2. Text Corrector
3. Add Punctuation
4. Text Filter
## Text Corrector
* [pycorrector](https://github.com/shibing624/pycorrector)
本项目重点解决其中的谐音、混淆音、形似字错误、中文拼音全拼、语法错误带来的纠错任务。PS[网友源码解读](https://zhuanlan.zhihu.com/p/138981644)
* DeepCorrection [1](https://praneethbedapudi.medium.com/deepcorrection-1-sentence-segmentation-of-unpunctuated-text-a1dbc0db4e98) [2](https://praneethbedapudi.medium.com/deepcorrection2-automatic-punctuation-restoration-ac4a837d92d9) [3](https://praneethbedapudi.medium.com/deepcorrection-3-spell-correction-and-simple-grammar-correction-d033a52bc11d) [4](https://praneethbedapudi.medium.com/deepsegment-2-0-multilingual-text-segmentation-with-vector-alignment-fd76ce62194f)
### Question
中文文本纠错任务,常见错误类型包括:
- 谐音字词,如 配副眼睛-配副眼镜
- 混淆音字词,如 流浪织女-牛郎织女
- 字词顺序颠倒,如 伍迪艾伦-艾伦伍迪
- 字词补全,如 爱有天意-假如爱有天意
- 形似字错误,如 高梁-高粱
- 中文拼音全拼,如 xingfu-幸福
- 中文拼音缩写,如 sz-深圳
- 语法错误,如 想象难以-难以想象
当然,针对不同业务场景,这些问题并不一定全部存在。
比如输入法中需要处理前四种,搜索引擎需要处理所有类型,语音识别后文本纠错只需要处理前两种, 其中'形似字错误'主要针对五笔或者笔画手写输入等。
### Solution
#### 规则的解决思路
1. 中文纠错分为两步走,第一步是错误检测,第二步是错误纠正;
2. 错误检测部分先通过结巴中文分词器切词,由于句子中含有错别字,所以切词结果往往会有切分错误的情况,这样从字粒度和词粒度两方面检测错误, 整合这两种粒度的疑似错误结果,形成疑似错误位置候选集;
3. 错误纠正部分,是遍历所有的疑似错误位置,并使用音似、形似词典替换错误位置的词,然后通过语言模型计算句子困惑度,对所有候选集结果比较并排序,得到最优纠正词。
#### 深度模型的解决思路
1. 端到端的深度模型可以避免人工提取特征减少人工工作量RNN序列模型对文本任务拟合能力强rnn_attention在英文文本纠错比赛中取得第一名成绩证明应用效果不错
2. CRF会计算全局最优输出节点的条件概率对句子中特定错误类型的检测会根据整句话判定该错误阿里参赛2016中文语法纠错任务并取得第一名证明应用效果不错
3. Seq2Seq模型是使用Encoder-Decoder结构解决序列转换问题目前在序列转换任务中如机器翻译、对话生成、文本摘要、图像描述使用最广泛、效果最好的模型之一
4. BERT/ELECTRA/ERNIE/MacBERT等预训练模型强大的语言表征能力对NLP界带来翻天覆地的改变海量的训练数据拟合的语言模型效果无与伦比基于其MASK掩码的特征可以简单改造预训练模型用于纠错加上fine-tune效果轻松达到最优。
### 规则检测方法
- kenlmkenlm统计语言模型工具规则方法语言模型纠错利用混淆集扩展性强
#### 错误检测
- 字粒度语言模型困惑度ppl检测某字的似然概率值低于句子文本平均值则判定该字是疑似错别字的概率大。
- 词粒度:切词后不在词典中的词是疑似错词的概率大。
#### 错误纠正
- 通过错误检测定位所有疑似错误后,取所有疑似错字的音似、形似候选词,
- 使用候选词替换,基于语言模型得到类似翻译模型的候选排序结果,得到最优纠正词。
#### 思考
1. 现在的处理手段,在词粒度的错误召回还不错,但错误纠正的准确率还有待提高,更多优质的纠错集及纠错词库会有提升。
2. 另外现在的文本错误不再局限于字词粒度上的拼写错误需要提高中文语法错误检测CGED, Chinese Grammar Error Diagnosis及纠正能力。
### Reference
* https://github.com/shibing624/pycorrector
* [基于文法模型的中文纠错系统](https://blog.csdn.net/mingzai624/article/details/82390382)
* [Norvigs spelling corrector](http://norvig.com/spell-correct.html)
* [Chinese Spelling Error Detection and Correction Based on Language Model, Pronunciation, and Shape[Yu, 2013]](http://www.aclweb.org/anthology/W/W14/W14-6835.pdf)
* [Chinese Spelling Checker Based on Statistical Machine Translation[Chiu, 2013]](http://www.aclweb.org/anthology/O/O13/O13-1005.pdf)
* [Chinese Word Spelling Correction Based on Rule Induction[yeh, 2014]](http://aclweb.org/anthology/W14-6822)
* [Neural Language Correction with Character-Based Attention[Ziang Xie, 2016]](https://arxiv.org/pdf/1603.09727.pdf)
* [Chinese Spelling Check System Based on Tri-gram Model[Qiang Huang, 2014]](http://www.anthology.aclweb.org/W/W14/W14-6827.pdf)
* [Neural Abstractive Text Summarization with Sequence-to-Sequence Models[Tian Shi, 2018]](https://arxiv.org/abs/1812.02303)
* [基于深度学习的中文文本自动校对研究与实现[杨宗霖, 2019]](https://github.com/shibing624/pycorrector/blob/master/docs/基于深度学习的中文文本自动校对研究与实现.pdf)
* [A Sequence to Sequence Learning for Chinese Grammatical Error Correction[Hongkai Ren, 2018]](https://link.springer.com/chapter/10.1007/978-3-319-99501-4_36)
* [ELECTRA: Pre-training Text Encoders as Discriminators Rather Than Generators](https://openreview.net/pdf?id=r1xMH1BtvB)
* [Revisiting Pre-trained Models for Chinese Natural Language Processing](https://arxiv.org/abs/2004.13922)
## Add Punctuation
* DeepCorrection [1](https://praneethbedapudi.medium.com/deepcorrection-1-sentence-segmentation-of-unpunctuated-text-a1dbc0db4e98) [2](https://praneethbedapudi.medium.com/deepcorrection2-automatic-punctuation-restoration-ac4a837d92d9) [3](https://praneethbedapudi.medium.com/deepcorrection-3-spell-correction-and-simple-grammar-correction-d033a52bc11d) [4](https://praneethbedapudi.medium.com/deepsegment-2-0-multilingual-text-segmentation-with-vector-alignment-fd76ce62194f)
## Text Filter
* 敏感词(黄暴、涉政、违法违禁等)

@ -1,70 +0,0 @@
# chinese syllable
## Syllable
* [List of Syllables in Pinyin](https://resources.allsetlearning.com/chinese/pronunciation/syllable)
The word syllable is a term referring to the units of a word, composed on an (optional) initial, a final, and a tone.
The word "syllable" is 音节 (yīnjié) in Chinese.
Most spoken syllables in Mandarin Chinese correspond to one written Chinese character.
There are a total of 410 common pinyin syllables.
* [Rare syllable](https://resources.allsetlearning.com/chinese/pronunciation/Rare_syllable)
* [Chinese Pronunciation: The Complete Guide for Beginner](https://www.digmandarin.com/chinese-pronunciation-guide.html)
* [Mandarin Chinese Phonetics](http://www.zein.se/patrick/chinen8p.html)
* [chinese phonetics](https://www.easymandarin.cn/online-chinese-lessons/chinese-phonetics/)
Chinese Characters, called “Hanzi”, are the writing symbols of the Chinese language.
Pinyin is the Romanization of a phonetic notation for Chinese Characters.
Each syllable is composed of three parts: initials, finals, and tones.
In the Pinyin system there are 23 initials, 24 finals, 4 tones and a neutral tone.
## Pinyin
* [Pinyin](https://en.wikipedia.org/wiki/Pinyin)
* [Pinyin quick start guide](https://resources.allsetlearning.com/chinese/pronunciation/Pinyin_quick_start_guide)
* [Pinyin Table](https://en.wikipedia.org/wiki/Pinyin_table)
* [Piyin Chat](https://resources.allsetlearning.com/chinese/pronunciation/Pinyin_chart)
* [Mandarin Chinese Pinyin Table](https://www.archchinese.com/chinese_pinyin.html)
* [Chinese Pinyin Table ](http://www.quickmandarin.com/chinesepinyintable/)
## Tones
* [Four tones](https://resources.allsetlearning.com/chinese/pronunciation/Four_tones)
* [Neutral tone](https://resources.allsetlearning.com/chinese/pronunciation/Neutral_tone)
* [Where do the tone marks go?](http://www.pinyin.info/rules/where.html)
* [声调符号标在哪儿?](http://www.hwjyw.com/resource/content/2010/06/04/8183.shtml)
## Zhuyin
* [Bopomofo](https://en.wikipedia.org/wiki/Bopomofo)
* [Zhuyin table](https://en.wikipedia.org/wiki/Zhuyin_table)
## Tone sandhi
* https://zh.wikipedia.org/wiki/%E8%AE%8A%E8%AA%BF
* https://github.com/mozillazg/python-pinyin/issues/133
pypinyin关于变调错误的评估
## tools
* https://github.com/KuangDD/phkit
* https://github.com/mozillazg/python-pinyin
* https://github.com/Kyubyong/g2pC
* https://github.com/kakaobrain/g2pM

@ -1,29 +0,0 @@
# CRF([Conditional Random Fields](http://blog.echen.me/2012/01/03/introduction-to-conditional-random-fields/))
## Repos
* https://github.com/kmkurn/pytorch-crf
* https://github.com/allenai/allennlp
* https://github.com/mtreviso/linear-chain-crf
## Reference
* [Overview of Conditional Random Fields](https://medium.com/ml2vec/overview-of-conditional-random-fields-68a2a20fa541)
* [Introduction to Conditional Random Fields](http://blog.echen.me/2012/01/03/introduction-to-conditional-random-fields/)]
* [Viterbi algorithm](https://en.wikipedia.org/wiki/Viterbi_algorithm)
* [Conditional Random Field Tutorial in PyTorch](https://towardsdatascience.com/conditional-random-field-tutorial-in-pytorch-ca0d04499463)
* [Implementing a linear-chain Conditional Random Field (CRF) in PyTorch](https://towardsdatascience.com/implementing-a-linear-chain-conditional-random-field-crf-in-pytorch-16b0b9c4b4ea)
* .https://homepages.inf.ed.ac.uk/csutton/publications/crftutv2.pdf
* [Implementing a linear-chain Conditional Random Field (CRF) in PyTorch](https://towardsdatascience.com/implementing-a-linear-chain-conditional-random-field-crf-in-pytorch-16b0b9c4b4ea)
* http://www.cs.columbia.edu/~mcollins/
* [Tagging Problems, and Hidden Markov Models](http://www.cs.columbia.edu/~mcollins/hmms-spring2013.pdf)
* http://www.cs.columbia.edu/~mcollins/crf.pdf
* [The Forward-Backward Algorithm](http://www.cs.columbia.edu/~mcollins/fb.pdf)
* [The Naive Bayes Model, Maximum-Likelihood Estimation, and the EM Algorithm](http://www.cs.columbia.edu/~mcollins/em.pdf)

@ -1,21 +0,0 @@
# Dataset
## Text
* [Tatoeba](https://tatoeba.org/cmn)
**Tatoeba is a collection of sentences and translations.** It's collaborative, open, free and even addictive. An open data initiative aimed at translation and speech recognition.
## Speech
* [Tatoeba](https://tatoeba.org/cmn)
**Tatoeba is a collection of sentences and translations.** It's collaborative, open, free and even addictive. An open data initiative aimed at translation and speech recognition.
### ASR Noise
* [asr-noises](https://github.com/speechio/asr-noises)

@ -1,10 +0,0 @@
# Decoding
## Reference
* [时间戳和N-Best](https://mp.weixin.qq.com/s?__biz=MzU2NjUwMTgxOQ==&mid=2247483956&idx=1&sn=80ce595238d84155d50f08c0d52267d3&chksm=fcaacae0cbdd43f62b1da60c8e8671a9e0bb2aeee94f58751839b03a1c45b9a3889b96705080&scene=21#wechat_redirect)
* [Viterbi algorithm](https://en.wikipedia.org/wiki/Viterbi_algorithm)
* [如何通俗地讲解 viterbi 算法](https://www.zhihu.com/question/20136144)

File diff suppressed because it is too large Load Diff

@ -1,14 +0,0 @@
# 线性代数
* https://www.3blue1brown.com/
* https://www.zhihu.com/column/c_1068883024023834624
### 矩阵分解
* [LU分解](https://zhuanlan.zhihu.com/p/54943042)
* [QR分解](https://zhuanlan.zhihu.com/p/54957185)
* SVD分解
* PCA分解
* NMF分解

@ -1,258 +0,0 @@
# Praat and TextGrid
* [**Praat: doing phonetics by computer**](https://www.fon.hum.uva.nl/praat/)
* [TextGrid](https://github.com/kylebgorman/textgrid)
## Praat
**Praat语音学软件**,原名**Praat: doing phonetics by computer**,通常简称**Praat**,是一款[跨平台](https://zh.wikipedia.org/wiki/跨平台)的多功能[语音学](https://zh.wikipedia.org/wiki/语音学)专业[软件](https://zh.wikipedia.org/wiki/软件),主要用于对[数字化](https://zh.wikipedia.org/wiki/数字化)的[语音](https://zh.wikipedia.org/wiki/语音)[信号](https://zh.wikipedia.org/wiki/信号)进行[分析](https://zh.wikipedia.org/w/index.php?title=语音分析&action=edit&redlink=1)、标注、[处理](https://zh.wikipedia.org/wiki/数字信号处理)及[合成](https://zh.wikipedia.org/wiki/语音合成)等实验,同时生成各种[语图](https://zh.wikipedia.org/w/index.php?title=语图&action=edit&redlink=1)和文字报表。
<img src="../images/Praat-output-showing-forced-alignment-for-Mae-hen-wlad-fy-nhadau-the-first-line-of-the.png" width=650>
## TextGrid
### TextGrid文件结构
```text
第一行是固定的:File type = "ooTextFile"
第二行也是固定的:Object class = "TextGrid"
空一行
xmin = xxxx.xxxx  # 表示开始时间
xmax = xxxx.xxxx  # 表示结束时间
tiers? <exists>  # 这一行固定
size = 4  # 表示这个文件有几个item, item也叫tiers, 可以翻译为'层', 这个值是几,就表示有几个item
item []:
    item [1]:
        class = "IntervalTier"
        name = "phone"
        xmin = 1358.8925
        xmax = 1422.5525
        intervals: size = 104
        intervals [1]:
            xmin = 1358.8925
            xmax = 1361.8925
            text = "sil"
        intervals [2]:
            xmin = 1361.8925
            xmax = 1362.0125
            text = "R"
        intervals [3]:
            ...
        intervals [104]:
            xmin = 1422.2325
            xmax = 1422.5525
            text = "sil"
    item [2]:
        class = "IntervalTier"
        name = "word"
        xmin = 1358.8925
        xmax = 1422.5525
        intervals: size = 3
        intervals [1]:
            xmin = 1358.8925
            xmax = 1361.8925
            text = "sp"
```
textgrid 文件中的 size 的值是几就表示有几个 item 每个 item 下面包含 class, name, xmin, xmax, intervals 的键值对item 中的 intervals: size 是几就表示这个 item 中有几个 intervals每个 intervals 有 xmin, xmax, text 三个键值参数。所有 item 中的 xmax - xmin 的值是一样的。
### 安装
```python
pip3 install textgrid
```
### 使用
1. 读一个textgrid文件
```python
import textgrid
tg = textgrid.TextGrid()
tg.read('file.TextGrid') # 'file.TextGrid' 是文件名
```
tg.tiers属性:
会把文件中的所有item打印出来, print(tg.tiers) 的结果如下:
```text
[IntervalTier(
phone, [
Interval(1358.89250, 1361.89250, sil),
Interval(1361.89250, 1362.01250, R),
Interval(1362.01250, 1362.13250, AY1),
Interval(1362.13250, 1362.16250, T),
...
]
)
]
```
此外, tg.tiers[0] 表示第一个 IntervalTier, 支持继续用中括号取序列, '.'来取属性.
比如:
```text
tg.tiers[0][0].mark --> 'sil'
tg.tiers[0].name --> 'phone'
tg.tiers[0][0].minTime --> 1358.8925
tg.tiers[0].intervals --> [Interval(1358.89250, 1361.89250, sil), ..., Interval(1422.23250, 1422.55250, sil)]
tg.tiers[0].maxTime --> 1422.55250
```
TextGrid 模块中包含四种对象
```
PointTier 可以理解为标记(点)的集合
IntervalTier 可以理解为时长(区间)的集合
Point 可以理解为标记
Interval 可以理解为时长
```
2. textgrid库中的对象
**IntervalTier** 对象:
方法
```
add(minTime, maxTime, mark): 添加一个标记,需要同时传入起止时间, 和mark的名字.
addInterval(interval): 添加一个Interval对象, 该Interval对象中已经封装了起止时间.
remove(minTime, maxTime, mark): 删除一个Interval
removeInterval(interval): 删除一个Interval
indexContaining(time): 传入时间或Point对象, 返回包含该时间的Interval对象的下标
例如:
print(tg[0].indexContaining(1362)) --> 1
表示tg[0] 中包含1362时间点的是 下标为1的 Interval 对象
intervalContaining(): 传入时间或Point对象, 返回包含该时间的Interval对象
例如
print(tg[0].intervalContaining(1362)) --> Interval(1361.89250, 1362.01250, R)
read(f): f是文件对象, 读一个TextGrid文件
write(f): f是文件对象, 写一个TextGrid文件
fromFile(f_path): f_path是文件路径, 从一个文件读
bounds(): 返回一个元组, (minTime, maxTime)
```
属性
```
intervals --> 返回所有的 interval 的列表
maxTime --> 返回 number(decimal.Decimal)类型, 表示结束时间
minTime --> 返回 number(decimal.Decimal)类型, 表示开始时间
name --> 返回字符串
strict -- > 返回bool值, 表示是否严格TextGrid格式
```
**PointTier** 对象:
方法
```
add(minTime, maxTime, mark): 添加一个标记,需要同时传入起止时间, 和mark的名字.
addPoint(point): 添加一个Point对象, 该Point对象中已经封装了起止时间.
remove(time, mark): 删除一个 point, 传入时间和mark
removePoint(point): 删除一个 point, 传入point对象
read(f): 读, f是文件对象
write(f): 写, f是文件对象
fromFile(f_path): f_path是文件路径, 从一个文件读
bounds(): 返回一个元组, (minTime, maxTime)
```
属性
```
points 返回所有的 point 的列表
maxTime 和IntervalTier一样, 返回结束时间
minTime 和IntervalTier一样, 返回开始时间
name 返回name
```
**Point** 对象:
支持比较大小, 支持加减运算
属性:
```
mark:
time:
```
**Interval** 对象:
支持比较大小, 支持加减运算
支持 in, not in 的运算
方法:
```
duration(): 返回number 类型, 表示这个Interval的持续时间
bounds(): --> 返回元组, (minTime, maxTime)
overlaps(Interval): --> 返回bool值, 判断本Interval的时间和传入的的Interval的时间是否重叠, 是返回True
```
属性:
```
mark
maxTime
minTime
strick: --> 返回bool值, 判断格式是否严格的TextGrid格式
```
**TextGrid** 对象:
支持列表的取值,复制, 迭代, 求长度, append, extend, pop方法
方法:
```
getFirst(tierName) 返回第一个名字为tierName的tier
getList(tierName) 返回名字为tierName的tier的列表
getNames() 返回所有tier的名字的列表
append(tier) 添加一个tier作为其中的元素
extend(tiers) 添加多个tier作为其中的元素
pop(tier) 删除一个tier
read(f) f是文件对象
write(f) f是文件对象
fromFile(f_path) f_path是文件路径
```
属性:
```
maxTime
minTime
name
strict
tiers 返回所有tiers的列表
```
**MLF** 对象
MLF('xxx.mlf')
'xxx.mlf'为mlf格式的文件,
读取hvite-o sm生成的htk.mlf文件并将其转换为 TextGrid的列表
方法:
```
read(f) f是文件对象
write(prefix='') prefix是写出路径的前缀,可选
```
属性:
```
grids: --> 返回读取的grids的列表
```
## Reference
* https://zh.wikipedia.org/wiki/Praat%E8%AF%AD%E9%9F%B3%E5%AD%A6%E8%BD%AF%E4%BB%B6
* https://blog.csdn.net/duxin_csdn/article/details/88966295

@ -1,145 +0,0 @@
# Speech Synthesis
* [爱丁堡大学公开课](http://speech.zone/courses/speech-synthesis)
* ### 推荐书籍
1. Daniel Jurafsky and James H. Martin, Speech and language processing: An introduction to natural language processing, computational linguistics, and speech recognition. 这本书之前在学习语音识别的时候也经常翻阅。 推荐阅读章节: Ch 7 & Ch 8 (都读过啦~)
2. Xuedong Huang, Alex Aceoro, Hsiao-Wuen Hon, Spoken Language Processing: A guide to theory, algorithm, and system development, Prentice Hall, 2011 这本书的三位作者都是大佬,本书推荐阅读 Ch2, Ch5, Ch6, Part IV: Text-to-Speech Systems. 学习一下基础知识点,如信号处理等
3. Paul Taylor, Text-to-Speech Synthesis, Cambridege University Press, 2009. 比较系统地讲述了神经网络之前的语音合成系统。
### 语音合成
现代语音合成主要包含文本分析和语音合成
#### 文本分析
文本分析主要分为
- **断句** : 怎么判断一句句子结束了,单纯用句号来切分并不靠谱,比如 B.C., Dr.J.M.,’。。。’
- **文本归一化** : 根据上下文消除一些词的读法常见有数字的读法”In 1950, he went to” -> “nineteen fifty”, “There are 1950 sheep.” => “one thousand and fifty”, “The code number is 1950” -> “one nine five zero”.
- **分词** : 将句子分成一个个的词,对于中文这种没有空格作为天然分隔符的语言是需要分词单元的。
- **词性分析** : 将分好的词中的每个词进行标注,”动词,名词,形容词,…”
- **注音** : 有些词的读音在不同上下文中发音是不一样的,比如 live -> /l ih v/ or /l ay v/ 中文中也有多音字的现象,所以需要进行标注。
- **韵律分析** : 声调,重读,韵律边界
#### 语音合成方法
**波形拼接** : 将各种语音单元拼接起来,需要考虑目标代价(目标语音单元和候选的语音单元匹配度)和连接代价(相邻语音单元之间的流畅度)
**基于轨迹指导的拼接合成**
**统计参数合成** : 帧级建模包括时长模型(音素序列->帧级文本特征)和声学模型(帧级文本特征->帧级语音输出)。主要方法是基于HMM 的 SPSS (Statistical Parametric Speech Synthesis), 可以用的工具包 HTS。
**神经网络合成方法** : 目前许多商用场景下已经部署了基于神经网络的语音合成模型。目前基于神经网络的方法还不是纯端到端的,分为两个部分,输入文本类信息(音素,时长等)经过神经网络得到输出特征(LF0, UV, 谱特征, bap), 接着将这些特征放到声码器(vocoder) 中得到对应的语音波形。主流方法是 Tactron, Tactron2, 注意力机制Transformer。正在朝着基于序列到序列的语音合成纯端到端的语音合成方向发展。
**声码器**的总结如下:
| **模型类型** | **模型** | **合成语音质量** | **效率** |
| ------------ | ----------------- | ---------------- | ---------- |
| AR | WaveNet | 非常好 | 非常差 |
| AR | WaveRNN | 非常好 | 中等 |
| AR | Multiband WaveRNN | 非常好 | 中等 |
| AR | LPCNET | 非常好 | 挺好的 |
| Non-AR | Parallel WaveNet | 非常好 | 还不错 |
| Non-AR | WaveGlow | 非常好 | 还不错 |
| Non-AR | FlowWaveNet | 非常好 | 还不错 |
| GAN | ParallelWaveGAN | 非常好 | 挺好的 |
| GAN | MelGAN | 挺好的 | 非常好 |
| GAN | MB-MelGAN | 非常好 | 非常非常好 |
从上面表格中可以看到基于神经网络的声码器效果都挺好的主要需要优化的就是生成的速度。出现了利用GAN的声码器之后推理速度也极大的提高了。
### 高阶话题
* 基于注意力机制的序列要序列的模型框架稳定性问题: 长句、连读、丢字、漏字、重复
* 小样本学习(few shots & one shot)
* 情感/表现力/可控性(句子内部细粒度控制,风格建模)
* 纯端到端
* 抗噪
* 语音转换
* 歌唱合成
### 语音合成评估
文本分析模块可以有比较客观的指标precision, recall, fscore 之类的。
生成的语音质量评估方法有:和参考样例之间的距离度量(DTW), 谱包络(MCD), F0轮廓V/UV Error 时长 (Duration RMSE)。
主观指标包括 MOSCMOS, AB Best, MUSHRA。
### 语音合成数据集
数据质量非常重要
中文: 标贝DB-1女性说话1万句10.3小时
英文: VCTK, LJSpeech, LibriSpeech, LibriTTS
### 非端到端的语音合
目前非端到端的语音合成算法有两种,
1)**参数语音合成方法**,其中*声学模型*包括基于隐马尔可夫(HMM)的统计参数语音合成和基于神经网络(NN)的统计参数语音合成,而*声码器*包括基于源-滤波器的声码器和基于NN的声码器
2) **单元拼接语音合成方法** 简单地理解是有一个很大的语音库包含了许多词/音素的发音,用一些方法将各个单元拼接起来。
#### 声学特征
传统声学模型这里的声学特征主要包括 MGC-梅尔生成倒谱, MCEP-梅尔倒谱, LSP-线谱对这些普参数加上激励参数如基频F0就是需要拟合的声学特征。而我们的音频通常都是一个个的采样点谱参数+激励参数是可以还原到音频采样点的。
常用的工具Straight, World, SPTK, [HTS](http://hts.sp.nitech.ac.jp/), [Pysptk](https://github.com/r9y9/pysptk)。
#### 基于HMM的统计参数语音合成
HMM 应用到 TTS 这里和 ASR 还是有些区别的。主要参考的论文是 [An Introduction to HMM-Based Speech Synthesis](https://www.researchgate.net/publication/265398553_An_Introduction_to_HMM-Based_Speech_Synthesis):
#### 基于 NN 的参数语音合成
基于 NN 的参数语音合成主要依赖时长模型和声学模型。
### 风格化和个性化语音合成
风格化和个性化语音合成,难点有三个方面:
- 风格化: 需要合成丰富且可控的语音,包括语速、停顿、重音、情感等。
- 个性化: 要求我们利用多说话人建模技术及说话人自适应技术,在少量录音室或非录音室数据的条件下,为某一新说话人定制语音合成模型。
- 迁移学习: 在只有一种语言的训练数据集下让说话人说另一种语言或者让说话人学习另一说话人的风格。迁移学习使我们能够利用额外的数据进行知识迁移,进而完成一些特定任务。
建模和评估比较困难、数据集标注成本高,标注人员对风格问题容易产生分歧、模型缺乏控制合成语音风格的能力。
## Reference
* https://slyne.github.io/%E5%85%AC%E5%BC%80%E8%AF%BE/2020/09/26/TTS/
* https://slyne.github.io/%E5%85%AC%E5%BC%80%E8%AF%BE/2020/10/25/TTS2/
* https://slyne.github.io/%E5%85%AC%E5%BC%80%E8%AF%BE/2020/12/04/TTS6/

@ -1,3 +0,0 @@
# Useful Tools
* [正则可视化和常用正则表达式](https://wangwl.net/static/projects/visualRegex/#)

@ -1,212 +0,0 @@
# Text Front End
## Text Segmentation
There are various libraries including some of the most popular ones like NLTK, Spacy, Stanford CoreNLP that that provide excellent, easy to use functions for sentence segmentation.
* https://github.com/bminixhofer/nnsplit
* [DeepSegment](https://github.com/notAI-tech/deepsegment) [blog](http://bpraneeth.com/projects/deepsegment) [1](https://praneethbedapudi.medium.com/deepcorrection-1-sentence-segmentation-of-unpunctuated-text-a1dbc0db4e98) [2](https://praneethbedapudi.medium.com/deepcorrection2-automatic-punctuation-restoration-ac4a837d92d9) [3](https://praneethbedapudi.medium.com/deepcorrection-3-spell-correction-and-simple-grammar-correction-d033a52bc11d) [4](https://praneethbedapudi.medium.com/deepsegment-2-0-multilingual-text-segmentation-with-vector-alignment-fd76ce62194f)
## Text Normalization(文本正则)
The **basic preprocessing steps** that occur in English NLP, including data cleaning, stemming/lemmatization, tokenization and stop words. **not all of these steps are necessary for Chinese text data!**
### Lexicon Normalization
Theres a concept similar to stems in this language, and theyre called Radicals. **Radicals are basically the building blocks of Chinese characters.** All Chinese characters are made up of a finite number of components which are put together in different orders and combinations. Radicals are usually the leftmost part of the character. There are around 200 radicals in Chinese, and they are used to index and categorize characters.
Therefore, procedures like stemming and lemmatization are not useful for Chinese text data because seperating the radicals would **change the words meaning entirely**.
### Tokenization
**Tokenizing breaks up text data into shorter pre-set strings**, which help build context and meaning for the machine learning model.
These “tags” label the part of speech. There are 24 part of speech tags and 4 proper name category labels in the `**jieba**` packages existing dictionary.
<img src="../images/jieba_tags.png" width=650>
### Stop Words
In NLP, **stop words are “meaningless” words** that make the data too noisy or ambiguous.
Instead of manually removing them, you could import the `**stopwordsiso**` package for a full list of Chinese stop words. More information can be found [here](https://pypi.org/project/stopwordsiso/). And with this, we can easily create code to filter out any stop words in large text data.
```python
!pip install stopwordsiso
import stopwordsiso
from stopwordsiso import stopwords
stopwords(["zh"]) # Chinese
```
文本正则化 文本正则化主要是讲非标准词(NSW)进行转化,比如:
1. 数字、电话号码: 10086 -> 一千零八十六/幺零零八六
2. 时间,比分: 23:20 -> 二十三点二十分/二十三比二十
3. 分数、小数、百分比: 3/4 -> 四分之三3.24 -> 三点一四, 15% -> 百分之十五
4. 符号、单位: ¥ -> 元, kg -> 千克
5. 网址、文件后缀: www. -> 三W点
其他转换:
1. 简体和繁体转换:中国语言 -> 中國語言
2. 半角和全角准换:, ->
### tools
* https://github.com/google/re2
* https://github.com/speechio/chinese_text_normalization
* [vinorm](https://github.com/NoahDrisort/vinorm) [cpp_verion](https://github.com/NoahDrisort/vinorm_cpp_version)
Python package for text normalization, use for frontend of Text-to-speech Reseach
* https://github.com/candlewill/CNTN
This is a ChiNese Text Normalization (CNTN) tool for Text-to-speech system, which is based on [sparrowhawk](https://github.com/google/sparrowhawk).
* [Simplified and Traditional Chinese Characters converter](https://github.com/berniey/hanziconv)
* [Halfwidth and Fullwidth](https://zh.wikipedia.org/wiki/%E5%85%A8%E5%BD%A2%E5%92%8C%E5%8D%8A%E5%BD%A2)
## Word Segmentation(分词)
分词之所以重要可以通过这个例子来说明:
广州市长隆马戏欢迎你 -> 广州市 长隆 马戏 欢迎你
如果没有分词错误会导致句意完全不正确:
广州 市长 隆马戏 欢迎你
分词常用方法分为最大前向匹配(基于字典)和基于CRF的分词方法。用CRF的方法相当于是把这个任务转换成了序列标注相比于基于字典的方法好处是对于歧义或者未登录词有较强的识别能力缺点是不能快速fix bug并且性能略低于词典。
中文分词的常见工具:
* https://github.com/lancopku/PKUSeg-python
* https://github.com/thunlp/THULAC-Python
* https://github.com/fxsjy/jieba
* CRF++
* https://github.com/isnowfy/snownlp
### MMSEG
* [MMSEG: A Word Identification System for Mandarin Chinese Text Based on Two Variants of the Maximum Matching Algorithm](http://technology.chtsai.org/mmseg/)
* [`中文分词`简单高效的MMSeg](https://www.cnblogs.com/en-heng/p/5872308.html)
* [mmseg分词算法及实现](https://blog.csdn.net/daniel_ustc/article/details/50488040)
* [Mmseg算法](https://www.jianshu.com/p/e4ae8d194487)
* [浅谈中文分词](http://www.isnowfy.com/introduction-to-chinese-segmentation/)
* [pymmseg-cpp](https://github.com/pluskid/pymmseg-cpp.git)
* [ustcdane/mmseg](https://github.com/ustcdane/mmseg)
* [jkom-cloud/mmseg](https://github.com/jkom-cloud/mmseg)
### CScanner
* [CScanner - A Chinese Lexical Scanner](http://technology.chtsai.org/cscanner/)
## Part of Speech(词性预测)
词性解释
```
n/名词 np/人名 ns/地名 ni/机构名 nz/其它专名
m/数词 q/量词 mq/数量词 t/时间词 f/方位词 s/处所词
v/动词 a/形容词 d/副词 h/前接成分 k/后接成分
i/习语 j/简称 r/代词 c/连词 p/介词 u/助词 y/语气助词
e/叹词 o/拟声词 g/语素 w/标点 x/其它
```
## G2P(注音)
注音是需要将词转换成对应的发音,对于中文是将其转换成拼音,比如 绿色->(lv4 se4) 这里的数字表示声调。
传统方法是使用字典,但是对于未登录词就很难解决。基于模型的方法是使用 [Phonetisaurus](https://github.com/AdolfVonKleist/Phonetisaurus)。 论文可以参考 - WFST-based Grapheme-to-Phoneme Conversion: Open Source Tools for Alignment, Model-Building and Decoding
当然这个问题也可以看做是序列标注用CRF或者基于神经网络的模型都可以做。 基于神经网络工具:
* https://github.com/kakaobrain/g2pM
* https://github.com/Kyubyong/g2p
## Prosody(韵律预测)
ToBI(an abbreviation of tones and break indices) is a set of conventions for transcribing and annotating the prosody of speech. 中文主要关注break。
韵律等级结构:
```
音素 -> 音节 -> 韵律词(Prosody Word, PW) -> 韵律短语(prosody phrase, PPH) -> 语调短句(intonational phrase, IPH) -> 子句子 -> 主句子 -> 段落 -> 篇章
LP -> LO -> L1(#1) -> L2(#2) -> L3(#3) -> L4(#4) -> L5 -> L6 -> L7
```
主要关注 PW, PPH, IPH
| | 停顿时长 | 前后音高特征 |
| --- | ----------| --- |
| 韵律词边界 | 不停顿或从听感上察觉不到停顿 | 无 |
| 韵律短语边界 | 可以感知停顿,但无明显的静音段 | 音高不下倾或稍下倾,韵末不可做句末 |
| 语调短语边界 | 有较长停顿 | 音高下倾比较完全,韵末可以作为句末 |
常用方法使用的是级联CRF首先预测如果是PW再继续预测是否是PPH再预测是否是IPH
<img src="../images/prosody.jpeg" width=450>
论文: 2015 .Ding Et al. - Automatic Prosody Prediction For Chinese Speech Synthesis Using BLSTM-RNN and Embedding Features
## Polyphone(多音字)
## Linguistic Features(语言学特征)
## 基于神经网络的前端文本分析模型
最近这两年基本都是基于 BERT所以这里记录一下相关的论文:
- g2p: 2019. Sevinj Et al. Transformer based Grapheme-to-Phoneme Conversion
- 分词: 2019 huang Et al. - Toward Fast and Accurate Neural Chinese Word Segmentation with Multi-Criteria Learning
- 韵律: 2020 Zhang Et al. - Chinese Prosodic Structure Prediction Based on a Pretrained Language Representation Model
除此之外BLSTM + CRF 也比较主流。
## 总结
总结一下,文本分析各个模块的方法:
TN: 基于规则的方法
分词: 字典/CRF/BLSTM+CRF/BERT
注音: ngram/CRF/BLSTM/seq2seq
韵律: CRF/BLSTM + CRF/ BERT
考虑到分词,注音,韵律都是基于序列标注任务,所以理论上来说可以通过一个模型搞定。
## Reference
* [Text Front End](https://slyne.github.io/%E5%85%AC%E5%BC%80%E8%AF%BE/2020/10/03/TTS1/)
* [Chinese Natural Language (Pre)processing: An Introduction](https://towardsdatascience.com/chinese-natural-language-pre-processing-an-introduction-995d16c2705f)
* [Beginners Guide to Sentiment Analysis for Simplified Chinese using SnowNLP](https://towardsdatascience.com/beginners-guide-to-sentiment-analysis-for-simplified-chinese-using-snownlp-ce88a8407efb)

@ -1,215 +0,0 @@
# Text Front End
## Text Segmentation
There are various libraries including some of the most popular ones like NLTK, Spacy, Stanford CoreNLP that that provide excellent, easy to use functions for sentence segmentation.
* https://github.com/bminixhofer/nnsplit
* [DeepSegment](https://github.com/notAI-tech/deepsegment) [blog](http://bpraneeth.com/projects/deepsegment) [1](https://praneethbedapudi.medium.com/deepcorrection-1-sentence-segmentation-of-unpunctuated-text-a1dbc0db4e98) [2](https://praneethbedapudi.medium.com/deepcorrection2-automatic-punctuation-restoration-ac4a837d92d9) [3](https://praneethbedapudi.medium.com/deepcorrection-3-spell-correction-and-simple-grammar-correction-d033a52bc11d) [4](https://praneethbedapudi.medium.com/deepsegment-2-0-multilingual-text-segmentation-with-vector-alignment-fd76ce62194f)
## Text Normalization(文本正则)
The **basic preprocessing steps** that occur in English NLP, including data cleaning, stemming/lemmatization, tokenization and stop words. **not all of these steps are necessary for Chinese text data!**
### Lexicon Normalization
Theres a concept similar to stems in this language, and theyre called Radicals. **Radicals are basically the building blocks of Chinese characters.** All Chinese characters are made up of a finite number of components which are put together in different orders and combinations. Radicals are usually the leftmost part of the character. There are around 200 radicals in Chinese, and they are used to index and categorize characters.
Therefore, procedures like stemming and lemmatization are not useful for Chinese text data because seperating the radicals would **change the words meaning entirely**.
### Tokenization
**Tokenizing breaks up text data into shorter pre-set strings**, which help build context and meaning for the machine learning model.
These “tags” label the part of speech. There are 24 part of speech tags and 4 proper name category labels in the `**jieba**` packages existing dictionary.
<img src="../images/jieba_tags.png" width=650>
### Stop Words
In NLP, **stop words are “meaningless” words** that make the data too noisy or ambiguous.
Instead of manually removing them, you could import the `**stopwordsiso**` package for a full list of Chinese stop words. More information can be found [here](https://pypi.org/project/stopwordsiso/). And with this, we can easily create code to filter out any stop words in large text data.
```python
!pip install stopwordsiso
import stopwordsiso
from stopwordsiso import stopwords
stopwords(["zh"]) # Chinese
```
文本正则化 文本正则化主要是讲非标准词(NSW)进行转化,比如:
1. 数字、电话号码: 10086 -> 一千零八十六/幺零零八六
2. 时间,比分: 23:20 -> 二十三点二十分/二十三比二十
3. 分数、小数、百分比: 3/4 -> 四分之三3.24 -> 三点一四, 15% -> 百分之十五
4. 符号、单位: ¥ -> 元, kg -> 千克
5. 网址、文件后缀: www. -> 三W点
其他转换:
1. 简体和繁体转换:中国语言 -> 中國語言
2. 半角和全角准换:, ->
### tools
* https://github.com/google/re2
* https://github.com/speechio/chinese_text_normalization
* [vinorm](https://github.com/NoahDrisort/vinorm) [cpp_verion](https://github.com/NoahDrisort/vinorm_cpp_version)
Python package for text normalization, use for frontend of Text-to-speech Reseach
* https://github.com/candlewill/CNTN
This is a ChiNese Text Normalization (CNTN) tool for Text-to-speech system, which is based on [sparrowhawk](https://github.com/google/sparrowhawk).
* [Simplified and Traditional Chinese Characters converter](https://github.com/berniey/hanziconv)
* [Halfwidth and Fullwidth](https://zh.wikipedia.org/wiki/%E5%85%A8%E5%BD%A2%E5%92%8C%E5%8D%8A%E5%BD%A2)
* https://github.com/BYVoid/OpenCC
## Word Segmentation(分词)
分词之所以重要可以通过这个例子来说明:
广州市长隆马戏欢迎你 -> 广州市 长隆 马戏 欢迎你
如果没有分词错误会导致句意完全不正确:
广州 市长 隆马戏 欢迎你
分词常用方法分为最大前向匹配(基于字典)和基于CRF的分词方法。用CRF的方法相当于是把这个任务转换成了序列标注相比于基于字典的方法好处是对于歧义或者未登录词有较强的识别能力缺点是不能快速fix bug并且性能略低于词典。
中文分词的常见工具:
* https://github.com/lancopku/PKUSeg-python
* https://github.com/thunlp/THULAC-Python
* https://github.com/fxsjy/jieba
* CRF++
* https://github.com/isnowfy/snownlp
### MMSEG
* [MMSEG: A Word Identification System for Mandarin Chinese Text Based on Two Variants of the Maximum Matching Algorithm](http://technology.chtsai.org/mmseg/)
* [`中文分词`简单高效的MMSeg](https://www.cnblogs.com/en-heng/p/5872308.html)
* [mmseg分词算法及实现](https://blog.csdn.net/daniel_ustc/article/details/50488040)
* [Mmseg算法](https://www.jianshu.com/p/e4ae8d194487)
* [浅谈中文分词](http://www.isnowfy.com/introduction-to-chinese-segmentation/)
* [pymmseg-cpp](https://github.com/pluskid/pymmseg-cpp.git)
* [ustcdane/mmseg](https://github.com/ustcdane/mmseg)
* [jkom-cloud/mmseg](https://github.com/jkom-cloud/mmseg)
### CScanner
* [CScanner - A Chinese Lexical Scanner](http://technology.chtsai.org/cscanner/)
## Part of Speech(词性预测)
词性解释
```
n/名词 np/人名 ns/地名 ni/机构名 nz/其它专名
m/数词 q/量词 mq/数量词 t/时间词 f/方位词 s/处所词
v/动词 a/形容词 d/副词 h/前接成分 k/后接成分
i/习语 j/简称 r/代词 c/连词 p/介词 u/助词 y/语气助词
e/叹词 o/拟声词 g/语素 w/标点 x/其它
```
## G2P(注音)
注音是需要将词转换成对应的发音,对于中文是将其转换成拼音,比如 绿色->(lv4 se4) 这里的数字表示声调。
传统方法是使用字典,但是对于未登录词就很难解决。基于模型的方法是使用 [Phonetisaurus](https://github.com/AdolfVonKleist/Phonetisaurus)。 论文可以参考 - WFST-based Grapheme-to-Phoneme Conversion: Open Source Tools for Alignment, Model-Building and Decoding
当然这个问题也可以看做是序列标注用CRF或者基于神经网络的模型都可以做。 基于神经网络工具:
* https://github.com/kakaobrain/g2pM
* https://github.com/Kyubyong/g2p
## Prosody(韵律预测)
ToBI(an abbreviation of tones and break indices) is a set of conventions for transcribing and annotating the prosody of speech. 中文主要关注break。
韵律等级结构:
```
音素 -> 音节 -> 韵律词(Prosody Word, PW) -> 韵律短语(prosody phrase, PPH) -> 语调短句(intonational phrase, IPH) -> 子句子 -> 主句子 -> 段落 -> 篇章
LP -> LO -> L1(#1) -> L2(#2) -> L3(#3) -> L4(#4) -> L5 -> L6 -> L7
```
主要关注 PW, PPH, IPH
| | 停顿时长 | 前后音高特征 |
| --- | ----------| --- |
| 韵律词边界 | 不停顿或从听感上察觉不到停顿 | 无 |
| 韵律短语边界 | 可以感知停顿,但无明显的静音段 | 音高不下倾或稍下倾,韵末不可做句末 |
| 语调短语边界 | 有较长停顿 | 音高下倾比较完全,韵末可以作为句末 |
常用方法使用的是级联CRF首先预测如果是PW再继续预测是否是PPH再预测是否是IPH
<img src="../images/prosody.jpeg" width=450>
论文: 2015 .Ding Et al. - Automatic Prosody Prediction For Chinese Speech Synthesis Using BLSTM-RNN and Embedding Features
## Polyphone(多音字)
## Linguistic Features(语言学特征)
## 基于神经网络的前端文本分析模型
最近这两年基本都是基于 BERT所以这里记录一下相关的论文:
- g2p: 2019. Sevinj Et al. Transformer based Grapheme-to-Phoneme Conversion
- 分词: 2019 huang Et al. - Toward Fast and Accurate Neural Chinese Word Segmentation with Multi-Criteria Learning
- 韵律: 2020 Zhang Et al. - Chinese Prosodic Structure Prediction Based on a Pretrained Language Representation Model
除此之外BLSTM + CRF 也比较主流。
## 总结
总结一下,文本分析各个模块的方法:
TN: 基于规则的方法
分词: 字典/CRF/BLSTM+CRF/BERT
注音: ngram/CRF/BLSTM/seq2seq
韵律: CRF/BLSTM + CRF/ BERT
考虑到分词,注音,韵律都是基于序列标注任务,所以理论上来说可以通过一个模型搞定。
## Reference
* [Text Front End](https://slyne.github.io/%E5%85%AC%E5%BC%80%E8%AF%BE/2020/10/03/TTS1/)
* [Chinese Natural Language (Pre)processing: An Introduction](https://towardsdatascience.com/chinese-natural-language-pre-processing-an-introduction-995d16c2705f)
* [Beginners Guide to Sentiment Analysis for Simplified Chinese using SnowNLP](https://towardsdatascience.com/beginners-guide-to-sentiment-analysis-for-simplified-chinese-using-snownlp-ce88a8407efb)

@ -1,31 +0,0 @@
# VAD
## Endpoint Detection
### Kaldi
**Kaldi**使用规则方式,制定了五条规则,只要满足其中一条则认为是检测到了 endpoint。
1. 识别出文字之前,检测到了 5s 的静音;
2. 识别出文字之后,检测到了 2s 的静音;
3. 解码到概率较小的 final state且检测到了 1s 的静音;
4. 解码到概率较大的 final state且检测到了 0.5s 的静音;
5. 已经解码了 20s。
### CTC
将连续的长 blank 标签,视为非语音区域。非语音区域满足一定的条件,即可认为是检测到了 endpoint。同时参考 Kaldi 的 `src/online2/online-endpoint.h`,制定了以下三条规则:
1. 识别出文字之前,检测到了 5s 的静音;
2. 识别出文字之后,检测到了 1s 的静音;
3. 已经解码了 20s。
只要满足上述三条规则中的任意一条, 就认为检测到了 endpoint。
## Reference
* [Endpoint 检测](https://mp.weixin.qq.com/s?__biz=MzU2NjUwMTgxOQ==&mid=2247484024&idx=1&sn=12da2ee76347de4a18856274ba6ba61f&chksm=fcaacaaccbdd43ba6b3e996bbf1e2ac6d5f1b449dfd80fcaccfbbe0a240fa1668b931dbf4bd5&scene=21#wechat_redirect)
* Kaldi: *https://github.com/kaldi-asr/kaldi/blob/6260b27d146e466c7e1e5c60858e8da9fd9c78ae/src/online2/online-endpoint.h#L132-L150*
* End-to-End Automatic Speech Recognition Integrated with CTC-Based Voice Activity Detection: *https://arxiv.org/pdf/2002.00551.pdf*
Loading…
Cancel
Save