Skip to content

Commit

Permalink
update(all):保密需要,删除部分章节和内容
Browse files Browse the repository at this point in the history
  • Loading branch information
cnlinxi committed Apr 19, 2022
1 parent 13b04cd commit 079886b
Show file tree
Hide file tree
Showing 7 changed files with 349 additions and 372 deletions.
213 changes: 106 additions & 107 deletions text_to_speech.aux

Large diffs are not rendered by default.

179 changes: 89 additions & 90 deletions text_to_speech.log

Large diffs are not rendered by default.

145 changes: 72 additions & 73 deletions text_to_speech.out

Large diffs are not rendered by default.

Binary file modified text_to_speech.pdf
Binary file not shown.
Binary file modified text_to_speech.synctex.gz
Binary file not shown.
36 changes: 9 additions & 27 deletions text_to_speech.tex
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@

\setcounter{tocdepth}{3}

% \logo{logo.jpg}
\cover{cover.jpeg}

% 本文档命令
Expand Down Expand Up @@ -338,8 +337,8 @@ \section{语音合成评价指标}
差 & 2.0 & 勉强,听不太清;延迟较大,交流需要重复多遍 \\
劣 & 1.0 & 极差,听不懂;延迟大,交流不通畅 \\
\bottomrule
\end{tabular}%
\end{table}%
\end{tabular}
\end{table}

在使用ACR方法对语音质量进行评价时,参与评测的人员(简称被试)对语音整体质量进行打分,分值范围为1~5分,分数越大表示语音质量越好。MOS大于4时,可以认为该音质受到大部分被试的认可,音质较好;若MOS低于3,则该语音有比较大的缺陷,大部分被试并不满意该音质。

Expand Down Expand Up @@ -374,8 +373,8 @@ \subsection{实验设计}
内部数据集 & Tacotron-2 & 40 & 12 \\
内部数据集 & FastSpeech-2 & 40 & 12 \\
\bottomrule
\end{tabular}%
\end{table}%
\end{tabular}
\end{table}

\item 准备HTML文档等展示材料,向被试介绍该测试。该HTML文档至少包括:(1)测试注意事项,如被试应该使用何种设备,在何种环境下试听,试听时应该排除的干扰因素等;(2)测试任务,向被试介绍本次试听的测试目标,应关注的侧重点,如:可懂度、相似度、清晰度等方面;(3)参考音频,可以放置一些示例音频,如MOS=5的优质语音,MOS=1的低劣音频,以便被试更好地对音频打分;(4) 测试音频,根据不同任务,放置合理的测试音频,真实和合成音频应提前打乱,并且不可告知被试打乱的顺序。

Expand Down Expand Up @@ -945,8 +944,8 @@ \subsection{利用librosa读取音频}
r & 音频文件的采样率 & 16k/16000/22050 \\
t & 音频文件的文件类型 & raw/mp3 \\
\bottomrule
\end{tabular}%
\end{table}%
\end{tabular}
\end{table}

\subsection{提取梅尔频谱}

Expand Down Expand Up @@ -1054,13 +1053,12 @@ \subsection{录音文本收集}

\begin{enumerate}
\item 音素覆盖。这就要求在录音开始之前,就需要构建起来一套基础的文本前端,最起码要有简单的文本转音素(G2P)系统。大部分语种的字符或者字符组合会有较为固定的发音,比如英语中的h总是会发[h]的音,o总是会发[eu]的音,如果找不到公开、即时可用的文本转音素系统,可以根据规则构建。用于录音的文本要保持多样性,音素或者音素组合要尽可能覆盖全,可以统计音素序列中的N-Gram,确保某些音素或者音素组合出现频次过高,而某些音素或音素组合又鲜少出现。
\item 场景定制。如果是通用语音合成,需要确保百科、新闻、对话、高频词、基数词和序数词等数字串、包含常用外来词(如包含英语单词)的句子要有所覆盖;如果是特定场景,比如车载领域,则可以收集车载播报的常用话术、专业术语(比如油量、胎压等)、音乐名或歌手名、地名和新闻播报,在特定场景下,需要对业务有一定的理解,并且在一开始就要和需求方紧密沟通。
\item 文本正确性。录音文本确保拼写无误,内容正确,比如需要删除脏话、不符合宗教信仰或政治不正确的语句等。
\end{enumerate}

\subsection{音频录制}

音频的录制对合成语音的表现较为重要,较差的语音甚至会导致端到端声学模型无法正常收敛。用于训练的录音至少要保证录音环境和设备始终保持一致,无混响、背景噪音;原始录音不可截幅;如果希望合成出来的语音干净,则要删除含口水音、呼吸音、杂音、模糊等,但对于目前的端到端合成模型,有时会学习到在合适的位置合成呼吸音、口水音,反而会增加语音自然度。录音尽可能不要事先处理,语速的调节尚可,但调节音效等有时会造成奇怪的问题,甚至导致声学模型无法收敛。音频的录制可以参考录音公司的标准,购买专业麦克风,并保持录音环境安静即可。在音库录制过程中,可尽早提前尝试声学模型,比如音库录制2个小时语音后,就可尝试训练基线语音合成系统,以防止录音不符合最终的需求。
音频的录制对合成语音的表现较为重要,较差的语音甚至会导致端到端声学模型无法正常收敛。用于训练的录音至少要保证录音环境和设备始终保持一致,无混响、背景噪音;原始录音不可截幅;如果希望合成出来的语音干净,则要删除含口水音、呼吸音、杂音、模糊等,但对于目前的端到端合成模型,有时会学习到在合适的位置合成呼吸音、口水音,反而会增加语音自然度。录音尽可能不要事先处理,语速的调节尚可,但调节音效等有时会造成奇怪的问题,甚至导致声学模型无法收敛。音频的录制可以参考录音公司的标准,购买专业麦克风,并保持录音环境安静即可。

\subsection{语料整理}

Expand Down Expand Up @@ -1118,21 +1116,6 @@ \subsection{文本前端的主要组成}
\item 韵律分析:语音中每个音素的发音时长不同,停顿也不同。将文本转换为音素之后,通常会加入一定的韵律信息,以帮助声学模型提升合成语音的自然度,加入的韵律信息可以分为音素(L0)、单词(L1)、breath break(L3)和句子(L4)四个韵律层级。
\end{enumerate}

\subsection{Unicode调研和文本预处理}

开展一个新语种的文本前端的开发,首要是调研该语种文字的字形、读音等,了解世界各语种的好去处无疑是\href{https://unicode.org/main.html}{Unicode官网}和维基百科。Unicode将世界上所有的字符均分配唯一数字标识,同时为了兼容和节省空间,常常采用“统一码转换格式-8”(UTF-8)、“统一码转换格式-16”(UTF-16)等具体实现该编码。具体来说,可以进入\href{https://www.unicode.org/charts/}{Unicode Code Charts}查询各个语种的编码。以最广泛使用的拉丁字符为例,\href{https://www.unicode.org/charts/PDF/U0000.pdf}{Basic Latin (ASCII)}文档中,首先是一页版权声明,之后展示了该类字符的Unicode码,最后是各个字符的简短介绍,帮助快速了解该语种。在介绍时,对于每一个字符,比如“!”,首先给出它的Unicode编码“0021”($\backslash$u0021),然后是该字符的字形如“!”,接下来一般是该字符的简介比如“EXCLAMATION MARK”,之后会给出一些补充信息,比如“=”表示该字符的其它含义, $\to$ 表示该字符的相关字符, $\equiv$ 表示该字符的同形异码。同形异码在多语种的文本前端中尤其需要注意,例如\href{https://www.unicode.org/charts/PDF/U0100.pdf}{Latin Extended-A}中,$\backslash$u0100的同形异码为$\backslash$u0041$\backslash$u0304,这种同形异码的字符需要统一处理为一种字符,用户的输入看起来相同,但在计算机中的表示是完全不同的。

文本前端中的文本预处理模块主要是处理非法输入、同形异码的替换等。文本前端收到输入之后,可以限制一些边界条件,比如防止用户将音视频输入文本前端,限制输入的字符串长度和种类等;之后就进入包括同形异码替换的文本清理模块。首先是确定输入文本的语种(可要求用户提供或者限制本语音合成系统的主要输入语种);之后是通用处理规则,比如删除“$\backslash$u200B”、“$\backslash$u200C”等不可见字符,统一标点符号,全角转半角,一些特殊数字如$\backslash$u00BD替换为“1/2”等等;然后是本语系的处理规则,此时主要对同形异码进行替换;然后是本语种的处理规则,主要是处理本语种的外来字符,比如在意大利语中,将奇形怪状的外来字符“Á”、“Ô、“Ä”、“Å”统一替换为“A”,连接词“Æ”替换为“AE”;最后是针对不同语种定制的后处理规则。逐级处理的好处是代码、层次清晰,当然为了方便,可以统一进行处理和替换。

相关的参考资料:

\begin{enumerate}
\item \href{https://unicode-table.com/cn}{Unicdoe搜索}
\item \href{https://unicode.org/main.html}{Unicode官网}
\item \href{https://www.unicode.org/terminology/term_zh_Hans_CN_en.html}{Unicode术语表(中英互译)}
\item \href{https://www.unicode.org/unibook}{Unicode实用工具}
\end{enumerate}

\subsection{文本规范化}

归一化目前是文本前端中的难点,学术界和工业界最普遍和精确的方法还是靠人肉堆规则,当然也逐渐出现了规则和模型混合的归一化系统,比如\href{https://arxiv.org/abs/1911.04128}{A Hybrid Text Normalization System Using Multi-Head Self-Attention For Mandarin}、\href{https://aclanthology.org/2020.emnlp-main.258/}{Cold-Start and Interpretability: Turning Regular Expressions into Trainable Recurrent Neural Networks}。
Expand All @@ -1149,7 +1132,7 @@ \subsection{文本规范化}

\subsection{分词}

对于世界上大部分的语种来说,空格是天然的单词边界,因此分词并非一个常见任务,仅有中日韩、泰语、越南语等语种需要分词。“最大最长匹配”是简单且常见的分词算法,该算法需要准备一个词典,在对文本进行切分时,根据切分方向的不同,还可分为前向、后向、前后向最长匹配算法。以“前向最长匹配算法”为例,该方法首先设定一个词的最大长度,将待切分文本开始到词最大长度内的字符作为“候选词”,每次扫描时,将该“候选词”和词典中的词进行匹配,如果没有找到,就缩短“候选词”的长度继续寻找,直到匹配到字典中的词或者“候选词”成为单字,然后继续切分剩余文本。为了降低“候选词”和词典匹配的算法复杂度,可以先将词典构建为Trie(称前缀树或字典树),对文本从前到后切分时,每次尝试加入待切分文本的一个字符,并查询当前节点的所有子节点,如果待加入字符存在于子节点中,则沿着该节点继续查询,否则退出该字符,并将之前节点的字符作为切分后的单词,以该字符为起始点作为剩余待切分文本
对于世界上大部分的语种来说,空格是天然的单词边界,因此分词并非一个常见任务,仅有少部分语种需要分词

为了提高分词的准确率,条件随机场、神经网络等方法也应用到了分词领域并取得了不错的效果。可参考:

Expand All @@ -1165,7 +1148,7 @@ \subsection{分词}

\subsection{文本转音素}

文本转音素(G2P/LTS)是将文本转换为注音表示的过程。最简单直白的文本转音素方法无疑是查词典,经过预处理和分词模块之后,文本被切分为一个个单词,利用词典查询单词对应的发音序列。但是对于带有缩略词、外来词的文本来说,情况略微复杂,因为查询缩略词、本语种和外来词词典的优先级不同,输出的音素序列有时也会有所不同。一个较好的处理逻辑是,最特殊、最有可能的单词优先处理。首先处理缩略词的发音,如果存在于缩略词词典中或者单词全大写时,则认为是缩略词,如果缩略词词典中有该词,直接输出音素序列,否则按照规则,比如按照每个字母的发音逐个给出发音;之后处理本土词的发音,如果存在于本土词词典中,则认为是本土词,直接从词典中给出音素序列;接下来处理英语单词,如果是英语收录词,则可以直接从词典中取出该英语词的音素序列,获得英语词的音素序列之后,注意要将英语音素转换为本土音素。当然,词典很难覆盖所有词,特别是语种构建的初期,大部分词都是集外词,需要利用一些规则或模型给出单词的发音。构建文本转音素规则的一般步骤是:1. 调研公开资料,了解该语种是否有重音和声调,并制定字符到音素的转换规则,注意音素要抓对立而非音变,比如cat[k]和fat[f]中的[k/f]就是一组对立,不同发音会导致意思发生改变,而tell[l]和telling[l]中的[l]虽然发音也不同,但是属于音变,发音不同并不会改变单词含义;2. 迭代,文本转音素规则,乃至音素体系都是一个迭代的过程,需要结合给定音素与实际模型合成的发音情况,不断完善音素规则。
文本转音素(G2P/LTS)是将文本转换为注音表示的过程。最简单直白的文本转音素方法无疑是查词典,经过预处理和分词模块之后,文本被切分为一个个单词,利用词典查询单词对应的发音序列。但是对于带有缩略词、外来词的文本来说,情况略微复杂,因为查询缩略词、本语种和外来词词典的优先级不同,输出的音素序列有时也会有所不同。一个较好的处理逻辑是,最特殊、最有可能的单词优先处理。首先处理缩略词的发音,如果存在于缩略词词典中或者单词全大写时,则认为是缩略词,如果缩略词词典中有该词,直接输出音素序列,否则按照规则,比如按照每个字母的发音逐个给出发音;之后处理本土词的发音,如果存在于本土词词典中,则认为是本土词,直接从词典中给出音素序列;接下来处理英语单词,如果是英语收录词,则可以直接从词典中取出该英语词的音素序列,获得英语词的音素序列之后,注意要将英语音素转换为本土音素。当然,词典很难覆盖所有词,特别是语种构建的初期,大部分词都是集外词,需要利用一些规则或模型给出单词的发音。

利用一个基础的词典,可以训练出一个G2P模型,给出任意一个单词的发音序列。同样有一些开源的G2P模型比如

Expand Down Expand Up @@ -2568,7 +2551,6 @@ \section{多语种语音合成}
\begin{enumerate}
\item 音库制作和构建。
\item 文本前端的构建。需要制定适用于一个语种语音合成的音素体系,构建该语种的文本规范化规则等,特别地,比如俄语、波斯语、阿拉伯语等语种有性数格的变化,提高了文本前端的复杂性。不同语种间文本前端模块也会有所不同,比如中泰越日等语种需要添加分词模块。
\item 语种中特殊发音现象。西班牙语、俄语等语种的升降调对合成语音自然度影响显著,具体来说,在标点处发音会产生较为明显的上扬、下降、先升后降、先降后升和平调现象。因此文本前端最好给出该升降调信息,声学后端需要将该升降调信息作为重要特征,输入到模型的多个模块中,以协助模型产生准确自然的升降调语音。与此同时,由于升降调是一个语块整体的表现,而非仅仅一个字母或者单词的发音变化,比如西班牙语可以将升降调信息标注到整个L3块上,而俄语更适合于仅仅标注到中心词上。
\item 跨语种语音合成。当代语种混杂的语言现象愈发明显,比如中文中夹杂英语单词,这就需要实现语种切换(code-switch)和跨语种(cross-lingual)语音合成。如果语料中存在单说话人跨语种语料,一般来说,直接训练就可以产生跨语种合成效果。实践中,如果跨语种语料较少,比如仅有200句跨语种语料,多个语种混训时共享语种间的音素能够获得更好的合成效果;如果跨语种语料较多,可以仅采用主要语种和跨语种语料进行训练,加入其它语种进行混训相反可能会产生较差的效果。如果没有跨语种语料,可以尝试数据增强方法伪造跨语种语料,比如对单语种语料进行拼接,构造跨语种语料;利用跨语种语音合成大模型伪造训练语料,训练跨语种语音合成模型。
\item 低资源语音合成。语料数量的增加可显著提升合成语音的效果\footnote{Latorre J, Bailleul C, Morrill T, et al. Combining Speakers of Multiple Languages to Improve Quality of Neural Voices[J]. arXiv preprint arXiv:2108.07737, 2021.},但世界上的语种数量较多,大部分语种并不存在大量高质量语音合成语料。主要的解决方案有跨语种迁移、跨说话人迁移、语音识别和合成对偶学习,以及无监督训练。参见\href{https://zhuanlan.zhihu.com/p/413274637}{论文速览:低资源语音合成}。
\end{enumerate}
Expand Down
Loading

0 comments on commit 079886b

Please sign in to comment.