<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=VerlorenMind</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=VerlorenMind"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/VerlorenMind"/>
		<updated>2026-08-04T13:37:08Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D0%BE%D0%BC%D0%BB%D0%BE%D1%81%D0%B0&amp;diff=82175</id>
		<title>Алгоритм Комлоса</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D0%BE%D0%BC%D0%BB%D0%BE%D1%81%D0%B0&amp;diff=82175"/>
				<updated>2022-01-25T13:08:24Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
&lt;br /&gt;
'''Алгоритм Комло́са''' {{---}} алгоритм, разработанный Яношем Комлосом (''венг. Komlós János''). Алгоритм предназначен для поиска ребра с наибольшим весом на путях между каждой парой вершин в подвешенных деревьях. Поиск таких рёбер используется при верификации [[Лемма о безопасном ребре#Необходимые определения | минимального остовного дерева]] путем проверки [[Критерий Тарьяна минимальности остовного дерева|критерия Тарьяна]].&lt;br /&gt;
&lt;br /&gt;
Пусть существует некоторый взвешенный неориентированный граф &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и его остовное дерево &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. Допустим, что для каждого ребра &amp;lt;math&amp;gt;\{u, v\}&amp;lt;/math&amp;gt; графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, не входящего в дерево &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, существует способ найти ребро с наибольшим весом в пути между вершинами &amp;lt;math&amp;gt;u, v&amp;lt;/math&amp;gt; в дереве &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. Тогда для проверки критерия Тарьяна достаточно сравнить веса таких рёбер с весами рёбер &amp;lt;math&amp;gt;\{u, v\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
=== Случай полного ветвящегося дерева ===&lt;br /&gt;
==== Общее описание подхода ====&lt;br /&gt;
Рассмотрим полное ветвящееся дерево &amp;lt;math&amp;gt;T = (V, E)&amp;lt;/math&amp;gt;, т.е. такое дерево, у вершин которого либо 0, либо 2 и более потомков, и все листья находятся на одном уровне. Для такого дерева Комлосом был показан вариант алгоритма, который находит ребро с максимальным весом на пути для каждой пары листьев, используя &amp;lt;math&amp;gt;O\left(n\log\left(\frac{m+n}{n}\right)\right)&amp;lt;/math&amp;gt; операций сравнения. Алгоритм разбивает путь между листьями на две части, начинающихся в листе и заканчивающихся в наименьшем общем предке этих листьев, и находит ребро с наибольшим весом в каждой части. После чего, одно из двух рёбер с большим весом выбирается ребром с наибольшим весом на пути из одной вершины в другую.&lt;br /&gt;
&lt;br /&gt;
Алгоритм вычисляет вес для каждой части пути следующим образом. Пусть &amp;lt;math&amp;gt;A(v, l)&amp;lt;/math&amp;gt; {{---}} ребро максимального веса на пути из корня в некоторый лист &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;, проходящий через вершину &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, ограниченном на отрезке &amp;lt;math&amp;gt;[v, l]&amp;lt;/math&amp;gt; (т.е. удалены все вершины от корня до предка v). Обозначим &amp;lt;math&amp;gt;A(v) = \{A(v, l) | l \text{ содержится в поддереве с корнем } v\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Предположим, что &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; {{---}} вершина-потомок &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, и известно множество &amp;lt;math&amp;gt;A(s) = \{A(s, l_1), A(s, l_2),\dots\}&amp;lt;/math&amp;gt;. Рассмотрим случай одного листа &amp;lt;math&amp;gt;l_i&amp;lt;/math&amp;gt;. Очевидно, что все пути из корня в &amp;lt;math&amp;gt;l_i&amp;lt;/math&amp;gt;, проходящие через &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, также проходят через &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;. Так как ребро &amp;lt;math&amp;gt;\{v, s\}&amp;lt;/math&amp;gt; связывает &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, получим, что &amp;lt;math&amp;gt;A(v, l_i) = \arg\max\{w(A(s, l_i)), w(\{v, s\})\}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w(e)&amp;lt;/math&amp;gt; - вес ребра &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt;. Следовательно, для того, чтобы найти &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt;, достаточно сравнить веса рёбер из &amp;lt;math&amp;gt;A(s)&amp;lt;/math&amp;gt; с весом ребра &amp;lt;math&amp;gt;\{v, s\}&amp;lt;/math&amp;gt;. Данное сравнение можно эффективно выполнить с помощью двоичного поиска.  Итоговое множество &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt; получается путем объединением множеств рёбер, полученных для каждого потомка. Таким образом, алгоритм, начиная с корня дерева, спускается до листьев графа и конструирует множества &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt; для каждой вершины.&lt;br /&gt;
&lt;br /&gt;
После нахождения множеств &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt;, алгоритм находит ребро с наибольшим весом на пути между двумя листьями следующим образом. Для всех листьев в дереве находится их наименьший общий предок, например, с помощью [[Алгоритм Тарьяна поиска LCA за O(1) в оффлайн|алгоритма Тарьяна]] со сложностью &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;. Пусть для некоторых двух листьев &amp;lt;math&amp;gt;l_i, l_j&amp;lt;/math&amp;gt; их наименьший общий предок &amp;lt;math&amp;gt;LCA(l_i, l_j) = v&amp;lt;/math&amp;gt;. Тогда ребром с наибольшим весом на пути из &amp;lt;math&amp;gt;l_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;l_j&amp;lt;/math&amp;gt; будет ребро &amp;lt;math&amp;gt;e = \arg\max\{w(A(v, l_i)), w(A(v, l_j))\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Комлос показал, что &amp;lt;math&amp;gt;\sum\limits_{v\in T} \log |A(v)| = O\left(|V|\log\left(\frac{|E|+|V|}{|V|}\right)\right)&amp;lt;/math&amp;gt;, что дает верхнюю границу для количества операций сравнений, используемых алгоритмом.&lt;br /&gt;
==== Эффективная реализация при помощи битового сжатия ====&lt;br /&gt;
В работе Валери Кинг был предложен [[Алгоритм Кинг|метод сведения общего случая остовного дерева к полному ветвящемуся дереву]], а также предложена эффективная реализация алгоритма Комлоса с использованием битового сжатия&amp;lt;ref name=&amp;quot;kingalg&amp;quot;&amp;gt;King, V. A simpler minimum spanning tree verification algorithm. Algorithmica 18, 263–270 (1997). https://doi.org/10.1007/BF02526037&amp;lt;/ref&amp;gt;. Описанные в работе структуры данных и битовые операции, которые возможно предвычислить и сохранить в таблице, обращение к которой занимает константное количество операций, позволяют выполнить алгоритм Комлоса за линейное время.&lt;br /&gt;
&lt;br /&gt;
Обозначим за &amp;lt;math&amp;gt;T=(V, E)&amp;lt;/math&amp;gt; полное ветвящееся дерево, полученное с помощью [[Алгоритм Кинг|алгоритма Кинг]]. Вершины в дереве нумеруются битовыми словами следующим образом:&lt;br /&gt;
# Каждый лист помечается порядковым номером 0, 1, 2... в двоичном представлении в порядке встречи листов при [[Обход_в_глубину,_цвета_вершин|обходе в глубину]].&lt;br /&gt;
# Каждый не-лист помечается номером своего потомка, содержащим наибольшее количество ведущих нулей.&lt;br /&gt;
Рёбра в дереве получают тег, который формируется следующим образом. Рассмотрим ребро &amp;lt;math&amp;gt;e = \{u, v\}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится дальше от корня. Пусть &amp;lt;math&amp;gt;d(v)&amp;lt;/math&amp;gt; обозначает расстояние от вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; до корня, а &amp;lt;math&amp;gt;i(v)&amp;lt;/math&amp;gt; {{---}} номер младшей единицы в номере вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;. Тогда тег ребра &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; {{---}} строка размера &amp;lt;math&amp;gt;\lceil\lg\lg |V|\rceil&amp;lt;/math&amp;gt;, записанная как последовательность &amp;lt;math&amp;gt;&amp;lt;d(v), i(v)&amp;gt;&amp;lt;/math&amp;gt;. В оригинальной работе было показано, что имея тег ребра и номер вершины, можно обнаружить ребро в графе за константное время.&lt;br /&gt;
&lt;br /&gt;
Для каждой вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; создается вектор длины &amp;lt;math&amp;gt;\lceil\lg|V|\rceil&amp;lt;/math&amp;gt;, обозначаемый как &amp;lt;math&amp;gt;LCA(v)&amp;lt;/math&amp;gt;, чей бит с номером i равен 1 тогда, когда существует путь из листа в поддереве с корнем &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; в лист в другом поддереве, наивысшая по уровню вершина которого (иначе говоря, наименьший общий предок двух листьев) находится на расстоянии &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Далее, вершины делятся на два класса. Если &amp;lt;math&amp;gt;|A(v)|&amp;gt;\frac{\lceil\lg|V|\rceil}{\lceil\lg\lg |V|\rceil}&amp;lt;/math&amp;gt;, то вершина &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; считается ''большой''; в противном случае вершина считается ''малой''. Для больших вершин создаются списки &amp;lt;math&amp;gt;bigList&amp;lt;/math&amp;gt;, для малых {{---}} &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt;. &amp;lt;math&amp;gt;BigList&amp;lt;/math&amp;gt; содержит теги рёбер из &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt; в порядке неубывания длин путей из корня в листья, соответствующих рёбрам. Для хранения такого списка требуется &amp;lt;math&amp;gt;\frac{|A(v)|\lceil\lg\lg |V|\rceil}{\lceil\lg|V|\rceil}=O(\log\log |V|)&amp;lt;/math&amp;gt; памяти.&lt;br /&gt;
&lt;br /&gt;
Для малой вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; обозначим за &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; ближайшего большого предка. Список &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt; содержит либо теги рёбер из &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt;, либо, если ребро &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt; содержится в интервале от корня до &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, указатель на &amp;lt;math&amp;gt;bigList&amp;lt;/math&amp;gt; вершины &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, содержащий тег для &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt;. Для каждой малой вершины запоминается номер первого элемента в &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt;, являющимся тегом. Элементы списка, идущие после первого тега, тоже являются тегами. Для хранения &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt; требуется одно битовое слово.&lt;br /&gt;
&lt;br /&gt;
==== Анализ сложности ====&lt;br /&gt;
Было показано, что в реализации с битовым сжатием операции для малых вершин выполняются за константное время. Если вершина большая, то стоимость предвычислений для неё составляет &amp;lt;math&amp;gt;|A(v)|\frac{\lceil\lg\lg |V|\rceil}{\lceil\lg|V|\rceil} = \Omega\left(\log |A(v)|\right)&amp;lt;/math&amp;gt; операций. Следовательно, общая сложность предвычислений составляет &amp;lt;math&amp;gt;O(\log |A(v)|)&amp;lt;/math&amp;gt; операций. Дополнительно алгоритм тратит &amp;lt;math&amp;gt;O(|V|+|E|)&amp;lt;/math&amp;gt; операций для построения списков &amp;lt;math&amp;gt;LCA(v)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;O(|V|)&amp;lt;/math&amp;gt; операций для обработки таблиц с предвычисленными значениями и &amp;lt;math&amp;gt;O(|E|)&amp;lt;/math&amp;gt; операций сравнения для нахождения ребра с максимальным весом из двух половин.&lt;br /&gt;
&lt;br /&gt;
В завершении алгоритма, требуется сравнить веса рёбер графа, которые не входят в остовное дерево, с найденными в остовном дереве рёбрами наибольшего веса, что потребует дополнительных &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; операций сравнения, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; {{---}} количество рёбер в исходном графе.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Критерий Тарьяна минимальности остовного дерева]]&lt;br /&gt;
* [[Алгоритм Кинг]]&lt;br /&gt;
* [[Алгоритм Тарьяна поиска LCA за O(1) в оффлайн]]&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* Komlós, J. Linear verification for spanning trees. Combinatorica 5, 57–65 (1985). https://doi.org/10.1007/BF02579443&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы на графах]]&lt;br /&gt;
[[Категория:Построение остовных деревьев]]&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D0%BE%D0%BC%D0%BB%D0%BE%D1%81%D0%B0&amp;diff=82174</id>
		<title>Алгоритм Комлоса</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D0%BE%D0%BC%D0%BB%D0%BE%D1%81%D0%B0&amp;diff=82174"/>
				<updated>2022-01-25T13:04:27Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
&lt;br /&gt;
'''Алгоритм Комло́са''' {{---}} алгоритм, разработанный Яношем Комлосом (''венг. Komlós János''). Алгоритм предназначен для поиска ребра с наибольшим весом на путях между каждой парой вершин в подвешенных деревьях. Поиск таких рёбер используется при верификации [[Лемма о безопасном ребре#Необходимые определения | минимального остовного дерева]] путем проверки [[Критерий Тарьяна минимальности остовного дерева|критерия Тарьяна]].&lt;br /&gt;
&lt;br /&gt;
Пусть существует некоторый взвешенный неориентированный граф &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и его остовное дерево &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. Допустим, что для каждого ребра &amp;lt;math&amp;gt;\{u, v\}&amp;lt;/math&amp;gt; графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, не входящего в дерево &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, существует способ найти ребро с наибольшим весом в пути между вершинами &amp;lt;math&amp;gt;u, v&amp;lt;/math&amp;gt; в дереве &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. Тогда для проверки критерия Тарьяна достаточно сравнить веса таких рёбер с весами рёбер &amp;lt;math&amp;gt;\{u, v\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
=== Случай полного ветвящегося дерева ===&lt;br /&gt;
==== Общее описание подхода ====&lt;br /&gt;
Рассмотрим полное ветвящееся дерево &amp;lt;math&amp;gt;T = (V, E)&amp;lt;/math&amp;gt;, т.е. такое дерево, у вершин которого либо 0, либо 2 и более потомков, и все листья находятся на одном уровне. Для такого дерева Комлосом был показан вариант алгоритма, который находит ребро с максимальным весом на пути для каждой пары листьев, используя &amp;lt;math&amp;gt;O\left(n\log\left(\frac{m+n}{n}\right)\right)&amp;lt;/math&amp;gt; операций сравнения. Алгоритм разбивает путь между листьями на две части, начинающихся в листе и заканчивающихся в наименьшем общем предке этих листьев, и находит ребро с наибольшим весом в каждой части. После чего, одно из двух рёбер с большим весом выбирается ребром с наибольшим весом на пути из одной вершины в другую.&lt;br /&gt;
&lt;br /&gt;
Алгоритм вычисляет вес для каждой части пути следующим образом. Пусть &amp;lt;math&amp;gt;A(v, l)&amp;lt;/math&amp;gt; {{---}} ребро максимального веса на пути из корня в некоторый лист &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;, проходящий через вершину &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, ограниченном на отрезке &amp;lt;math&amp;gt;[v, l]&amp;lt;/math&amp;gt; (т.е. удалены все вершины от корня до предка v). Обозначим &amp;lt;math&amp;gt;A(v) = \{A(v, l) | l \text{ содержится в поддереве с корнем } v\}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;w(e)&amp;lt;/math&amp;gt; - вес ребра &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt;.&lt;br /&gt;
Предположим, что &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; {{---}} вершина-потомок &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, и известно множество &amp;lt;math&amp;gt;A(s) = \{A(s, l_1), A(s, l_2),\dots\}&amp;lt;/math&amp;gt;. Рассмотрим случай одного листа &amp;lt;math&amp;gt;l_i&amp;lt;/math&amp;gt;. Очевидно, что все пути из корня в &amp;lt;math&amp;gt;l_i&amp;lt;/math&amp;gt;, проходящие через &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, также проходят через &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;. Так как ребро &amp;lt;math&amp;gt;\{v, s\}&amp;lt;/math&amp;gt; связывает &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, получим, что &amp;lt;math&amp;gt;A(v, l_i) = \arg\max\{w(A(s, l_i)), w(\{v, s\})\}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w(e)&amp;lt;/math&amp;gt; - вес ребра &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt;. Следовательно, для того, чтобы найти &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt;, достаточно сравнить веса рёбер из &amp;lt;math&amp;gt;A(s)&amp;lt;/math&amp;gt; с весом ребра &amp;lt;math&amp;gt;\{v, s\}&amp;lt;/math&amp;gt;. Данное сравнение можно эффективно выполнить с помощью двоичного поиска.  Итоговое множество &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt; получается путем объединением множеств рёбер, полученных для каждого потомка. Таким образом, алгоритм, начиная с корня дерева, спускается до листьев графа и конструирует множества &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt; для каждой вершины.&lt;br /&gt;
&lt;br /&gt;
После нахождения множеств &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt;, алгоритм находит ребро с наибольшим весом на пути между двумя листьями следующим образом. Для всех листьев в дереве находится их наименьший общий предок, например, с помощью [[Алгоритм Тарьяна поиска LCA за O(1) в оффлайн|алгоритма Тарьяна]] со сложностью &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;. Пусть для некоторых двух листьев &amp;lt;math&amp;gt;l_i, l_j&amp;lt;/math&amp;gt; их наименьший общий предок &amp;lt;math&amp;gt;LCA(l_i, l_j) = v&amp;lt;/math&amp;gt;. Тогда ребром с наибольшим весом на пути из &amp;lt;math&amp;gt;l_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;l_j&amp;lt;/math&amp;gt; будет ребро &amp;lt;math&amp;gt;e = \arg\max\{w(A(v, l_i)), w(A(v, l_j))\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Комлос показал, что &amp;lt;math&amp;gt;\sum\limits_{v\in T} \log |A(v)| = O\left(|V_T|\log\left(\frac{|E_T|+|V_T|}{|V_T|}\right)\right)&amp;lt;/math&amp;gt;, что дает верхнюю границу для количества операций сравнений, используемых алгоритмом.&lt;br /&gt;
==== Эффективная реализация при помощи битового сжатия ====&lt;br /&gt;
В работе Валери Кинг был предложен [[Алгоритм Кинг|метод сведения общего случая остовного дерева к полному ветвящемуся дереву]], а также предложена эффективная реализация алгоритма Комлоса с использованием битового сжатия&amp;lt;ref name=&amp;quot;kingalg&amp;quot;&amp;gt;King, V. A simpler minimum spanning tree verification algorithm. Algorithmica 18, 263–270 (1997). https://doi.org/10.1007/BF02526037&amp;lt;/ref&amp;gt;. Описанные в работе структуры данных и битовые операции, которые возможно предвычислить и сохранить в таблице, обращение к которой занимает константное количество операций, позволяют выполнить алгоритм Комлоса за линейное время.&lt;br /&gt;
&lt;br /&gt;
Обозначим за &amp;lt;math&amp;gt;T=(V, E)&amp;lt;/math&amp;gt; полное ветвящееся дерево, полученное с помощью [[Алгоритм Кинг|алгоритма Кинг]]. Вершины в дереве нумеруются битовыми словами следующим образом:&lt;br /&gt;
# Каждый лист помечается порядковым номером 0, 1, 2... в двоичном представлении в порядке встречи листов при [[Обход_в_глубину,_цвета_вершин|обходе в глубину]].&lt;br /&gt;
# Каждый не-лист помечается номером своего потомка, содержащим наибольшее количество ведущих нулей.&lt;br /&gt;
Рёбра в дереве получают тег, который формируется следующим образом. Рассмотрим ребро &amp;lt;math&amp;gt;e = \{u, v\}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится дальше от корня. Пусть &amp;lt;math&amp;gt;d(v)&amp;lt;/math&amp;gt; обозначает расстояние от вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; до корня, а &amp;lt;math&amp;gt;i(v)&amp;lt;/math&amp;gt; {{---}} номер младшей единицы в номере вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;. Тогда тег ребра &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; {{---}} строка размера &amp;lt;math&amp;gt;\lceil\lg\lg |V|\rceil&amp;lt;/math&amp;gt;, записанная как последовательность &amp;lt;math&amp;gt;&amp;lt;d(v), i(v)&amp;gt;&amp;lt;/math&amp;gt;. В оригинальной работе было показано, что имея тег ребра и номер вершины, можно обнаружить ребро в графе за константное время.&lt;br /&gt;
&lt;br /&gt;
Для каждой вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; создается вектор длины &amp;lt;math&amp;gt;\lceil\lg|V|\rceil&amp;lt;/math&amp;gt;, обозначаемый как &amp;lt;math&amp;gt;LCA(v)&amp;lt;/math&amp;gt;, чей бит с номером i равен 1 тогда, когда существует путь из листа в поддереве с корнем &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; в лист в другом поддереве, наивысшая по уровню вершина которого (иначе говоря, наименьший общий предок двух листьев) находится на расстоянии &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Далее, вершины делятся на два класса. Если &amp;lt;math&amp;gt;|A(v)|&amp;gt;\frac{\lceil\lg|V|\rceil}{\lceil\lg\lg |V|\rceil}&amp;lt;/math&amp;gt;, то вершина &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; считается ''большой''; в противном случае вершина считается ''малой''. Для больших вершин создаются списки &amp;lt;math&amp;gt;bigList&amp;lt;/math&amp;gt;, для малых {{---}} &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt;. &amp;lt;math&amp;gt;BigList&amp;lt;/math&amp;gt; содержит теги рёбер из &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt; в порядке неубывания длин путей из корня в листья, соответствующих рёбрам. Для хранения такого списка требуется &amp;lt;math&amp;gt;\frac{|A(v)|\lceil\lg\lg |V|\rceil}{\lceil\lg|V|\rceil}=O(\log\log |V|)&amp;lt;/math&amp;gt; памяти.&lt;br /&gt;
&lt;br /&gt;
Для малой вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; обозначим за &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; ближайшего большого предка. Список &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt; содержит либо теги рёбер из &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt;, либо, если ребро &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt; содержится в интервале от корня до &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, указатель на &amp;lt;math&amp;gt;bigList&amp;lt;/math&amp;gt; вершины &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, содержащий тег для &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt;. Для каждой малой вершины запоминается номер первого элемента в &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt;, являющимся тегом. Элементы списка, идущие после первого тега, тоже являются тегами. Для хранения &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt; требуется одно битовое слово.&lt;br /&gt;
&lt;br /&gt;
==== Анализ сложности ====&lt;br /&gt;
Было показано, что в реализации с битовым сжатием операции для малых вершин выполняются за константное время. Если вершина большая, то стоимость предвычислений для неё составляет &amp;lt;math&amp;gt;|A(v)|\frac{\lceil\lg\lg |V|\rceil}{\lceil\lg|V|\rceil} = \Omega\left(\log |A(v)|\right)&amp;lt;/math&amp;gt; операций. Следовательно, общая сложность предвычислений составляет &amp;lt;math&amp;gt;O(\log |A(v)|)&amp;lt;/math&amp;gt; операций. Дополнительно алгоритм тратит &amp;lt;math&amp;gt;O(|V|+|E|)&amp;lt;/math&amp;gt; операций для построения списков &amp;lt;math&amp;gt;LCA(v)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;O(|V|)&amp;lt;/math&amp;gt; операций для обработки таблиц с предвычисленными значениями и &amp;lt;math&amp;gt;O(|E|)&amp;lt;/math&amp;gt; операций сравнения для нахождения ребра с максимальным весом из двух половин.&lt;br /&gt;
&lt;br /&gt;
В завершении алгоритма, требуется сравнить веса рёбер графа, которые не входят в остовное дерево, с найденными в остовном дереве рёбрами наибольшего веса, что потребует дополнительных &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; операций сравнения, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; {{---}} количество рёбер в исходном графе.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Критерий Тарьяна минимальности остовного дерева]]&lt;br /&gt;
* [[Алгоритм Кинг]]&lt;br /&gt;
* [[Алгоритм Тарьяна поиска LCA за O(1) в оффлайн]]&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* Komlós, J. Linear verification for spanning trees. Combinatorica 5, 57–65 (1985). https://doi.org/10.1007/BF02579443&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы на графах]]&lt;br /&gt;
[[Категория:Построение остовных деревьев]]&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D0%B8%D0%BD%D0%B3&amp;diff=82173</id>
		<title>Алгоритм Кинг</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D0%B8%D0%BD%D0%B3&amp;diff=82173"/>
				<updated>2022-01-25T13:04:14Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: Перемещение части об алгоритме Комлоса в отдельную статью&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
&lt;br /&gt;
'''Алгоритм Кинг''' {{---}} алгоритм, предложенный Валери Кинг (''англ. Valerie King''), позволяющий свести проверку минимальности [[Лемма о безопасном ребре#Необходимые определения |остовного дерева]] графа к случаю полного ветвящегося дерева. Данное вспомогательное дерево может быть использовано в частном случае [[Алгоритм Комлоса| алгоритма Комлоса]], для которого также была предложена эффективная реализация, позволяющая выполнить проверку минимальности за линейное время. Алгоритм имеет линейную сложность, что является преимуществом по сравнению с ранними подходами&amp;lt;ref name=&amp;quot;tarjan&amp;quot;&amp;gt;Tarjan, R.E., 1979. Applications of path compression on balanced trees. Journal of the ACM (JACM), 26(4), pp.690-715.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;drt&amp;quot;&amp;gt;B. Dixon, M. Rauch, and R. Tarjan, Verification and sensitivity analysis of minimum spanning trees in linear time,SIAM J. Comput.,21(6) (1992), 1184–1192.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;komlos&amp;quot;&amp;gt;Komlós, J. Linear verification for spanning trees. Combinatorica 5, 57–65 (1985). https://doi.org/10.1007/BF02579443&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T = (V_T, E_T)&amp;lt;/math&amp;gt; {{---}} остовное дерево неориентированного взвешенного графа &amp;lt;math&amp;gt;G = (V_G, E_G)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Проверка минимальности остовного дерева заключается в проверке [[Критерий Тарьяна минимальности остовного дерева|критерия Тарьяна]]: &lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Остовное дерево является минимальным тогда и только тогда, когда вес любого ребра графа, соединяющего вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, не входящего в остовное дерево, больше либо равен весу ребра, имеющего максимальный вес среди ребер входящих в путь между &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; в остовном дереве.&lt;br /&gt;
}}&lt;br /&gt;
Используем следующие обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\{u, v\}&amp;lt;/math&amp;gt; {{---}} ребро, соединяющее вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;T(u, v)&amp;lt;/math&amp;gt; {{---}} множество рёбер, входящих в путь между вершинами &amp;lt;math&amp;gt;u, v&amp;lt;/math&amp;gt; в дереве &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;w(e)&amp;lt;/math&amp;gt; {{---}} вес ребра &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;Heavy(T, u, v) = \arg\max\{w(e) | e\in T(u, v)\}&amp;lt;/math&amp;gt; {{---}} ребро с максимальным весом на пути между вершинами &amp;lt;math&amp;gt;u, v&amp;lt;/math&amp;gt; в дереве &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;.&lt;br /&gt;
Если найти &amp;lt;math&amp;gt;Heavy(T, u, v)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;u, v \in V_T&amp;lt;/math&amp;gt;, то для проверки минимальности остовного дерева достаточно сравнить &amp;lt;math&amp;gt;w(Heavy(T, u, v))&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;w(\{u, v\})&amp;lt;/math&amp;gt; для всех рёбер &amp;lt;math&amp;gt;\{u, v\} \in E_G \setminus E_T&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Построение вспомогательного дерева ===&lt;br /&gt;
Алгоритм строит вспомогательное дерево &amp;lt;math&amp;gt;B = (V_B, E_B)&amp;lt;/math&amp;gt;, являющееся подвешенным и полным ветвящимся (такое дерево, у вершин которого либо 0, либо 2 и более потомков, и в котором все листья находятся на одном уровне), для которого будет выполняться следующее: &amp;lt;math&amp;gt;w(Heavy(B, u, v)) = w(Heavy(T, u, v))&amp;lt;/math&amp;gt; для любой пары вершин &amp;lt;math&amp;gt;u, v \in V_T&amp;lt;/math&amp;gt;. Построение дерева &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; основано на [[Алгоритм Борувки|алгоритме Борувки]]. При инициализации алгоритма для каждой вершины &amp;lt;math&amp;gt;v \in T&amp;lt;/math&amp;gt; создается лист &amp;lt;math&amp;gt;f(v)&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Пусть на некотором шаге алгоритма Борувки алгоритм объединяет множество деревьев &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; в одно дерево, обозначаемое &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. При этом алгоритм выбирает некоторые рёбра с наименьшим весом, прилегающие к деревьям из множества &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Обозначим такое ребро для некоторого дерева &amp;lt;math&amp;gt;a \in A&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;adj(a)&amp;lt;/math&amp;gt;. Тогда алгоритм создает новую вершину &amp;lt;math&amp;gt;f(t)&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;V_B&amp;lt;/math&amp;gt; и добавляет новые рёбра в &amp;lt;math&amp;gt;E_B&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;\{\{f(t), f(a)\} | a \in A\}&amp;lt;/math&amp;gt;. Каждому ребру &amp;lt;math&amp;gt;\{f(t), f(a)\}&amp;lt;/math&amp;gt; присваивается вес выбранного алгоритмом Борувки ребра, т.е. &amp;lt;math&amp;gt;w(\{f(t), f(a)\}) := w(adj(a))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Сложность каждой фазы алгоритма пропорциональна количеству рёбер, не выбранных ранее. Так как &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; является деревом, количество таких рёбер равно количеству деревьев на шаге алгоритма минус один. После каждой фазы количество деревьев сокращается как минимум вдвое, поэтому можно заключить, что построение дерева &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет сложность &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=1&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T = (V_T, E_T)&amp;lt;/math&amp;gt; {{---}} остовное дерево графа, и &amp;lt;math&amp;gt;B = (V_B, E_B)&amp;lt;/math&amp;gt; {{---}} дерево, построенное алгоритмом. Тогда для каждой пары вершин &amp;lt;math&amp;gt;x, y \in V_T&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;w(Heavy(T, x, y)) = w(Heavy(B, f(x), f(y)))&amp;lt;/math&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Вначале покажем, что для каждого ребра &amp;lt;math&amp;gt;e \in B(f(x), f(y))&amp;lt;/math&amp;gt; существует ребро &amp;lt;math&amp;gt;e'\in T(x,y)&amp;lt;/math&amp;gt; для которого верно &amp;lt;math&amp;gt;w(e) \leq w(e')&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;e = \{a, b\}&amp;lt;/math&amp;gt; и, без потери общности, положим, что вершина &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; находится дальше от корня дерева &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, чем &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Тогда &amp;lt;math&amp;gt;a = f(t)&amp;lt;/math&amp;gt; для некоторого дерева &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, построенного на некотором шаге алгоритма Борувки, которое содержит либо &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, либо &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, но не обе вершины одновременно. &lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;e' \in T(x, y)&amp;lt;/math&amp;gt; {{---}} ребро, содержащее ровно одно окончание в дереве &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Так как во время фазы, в которой производился выбор ребра для дерева &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, была возможность выбрать ребро &amp;lt;math&amp;gt;e'&amp;lt;/math&amp;gt;, его вес &amp;lt;math&amp;gt;w(e') \geq w(e)&amp;lt;/math&amp;gt;, что и требовалось показать.  &lt;br /&gt;
&lt;br /&gt;
Остается доказать следующее:&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть ребро &amp;lt;math&amp;gt;e \in T(x,y)&amp;lt;/math&amp;gt; имеет максимальный вес. Тогда существует ребро в &amp;lt;math&amp;gt;B(f(x), f(y))&amp;lt;/math&amp;gt;, имеющее такой же вес.&lt;br /&gt;
}}&lt;br /&gt;
Предположим, что существует единственное ребро в &amp;lt;math&amp;gt;T(x, y)&amp;lt;/math&amp;gt;, имеющее максимальный вес. Доказательство тривиально обобщается на случай нескольких рёбер с максимальным весом. &lt;br /&gt;
&lt;br /&gt;
Если ребро &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; было выбрано алгоритмом Борувки для дерева, которое содержит &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, тогда ребру в &amp;lt;math&amp;gt;B(f(x), f(y))&amp;lt;/math&amp;gt; был присвоен вес &amp;lt;math&amp;gt;w(e)&amp;lt;/math&amp;gt;. Предположим обратное {{---}} ребро &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; было выбрано алгоритмом для дерева, не содержащего вершины &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Одно из окончаний ребра &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; находится в этом дереве, и данная вершина является промежуточной на пути из &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Следовательно, это ребро прилегает к минимум двум другим рёбрам, находящимся на пути из &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Тогда среди этих рёбер &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; является ребром с наибольшим весом, которое не было выбрано, что является противоречием.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Использование вспомогательного дерева ==&lt;br /&gt;
Построенное вспомогательное дерево позволяет свести задачу проверки минимального остовного дерева к случаю полного ветвящегося дерева, что является частным случаем [[Алгоритм Комлоса#Случай полного ветвящегося дерева|алгоритма Комлоса]] верификации минимального остовного дерева. Кинг была предложена [[Алгоритм Комлоса#Эффективная реализация при помощи битового сжатия|эффективная реализация]] данного случая с использованием битового сжатия, позволяющая проверить минимальность остовного дерева со сложностью &amp;lt;math&amp;gt;O(|E_T|+|V_T|)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Алгоритм Комлоса]]&lt;br /&gt;
* [[Алгоритм Борувки]]&lt;br /&gt;
* [[Критерий Тарьяна минимальности остовного дерева]] &lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* King, V. A simpler minimum spanning tree verification algorithm. Algorithmica 18, 263–270 (1997). https://doi.org/10.1007/BF02526037&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы на графах]]&lt;br /&gt;
[[Категория:Построение остовных деревьев]]&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D0%BE%D0%BC%D0%BB%D0%BE%D1%81%D0%B0&amp;diff=82172</id>
		<title>Алгоритм Комлоса</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D0%BE%D0%BC%D0%BB%D0%BE%D1%81%D0%B0&amp;diff=82172"/>
				<updated>2022-01-25T12:35:13Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: Перенос части про алгоритм Комлоса в отдельную статью из статьи про алгоритм Кинг&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
&lt;br /&gt;
'''Алгоритм Комло́са''' {{---}} алгоритм, разработанный Яношем Комлосом (''венг. Komlós János''). Алгоритм предназначен для поиска ребра с наибольшим весом на путях между каждой парой вершин в подвешенных деревьях. Поиск таких рёбер используется при верификации [[Лемма о безопасном ребре#Необходимые определения | минимального остовного дерева]] путем проверки [[Критерий Тарьяна минимальности остовного дерева|критерия Тарьяна]].&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
=== Случай полного ветвящегося дерева ===&lt;br /&gt;
==== Общее описание подхода ====&lt;br /&gt;
Рассмотрим полное ветвящееся дерево &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, т.е. такое дерево, у вершин которого либо 0, либо 2 и более потомков, и все листья находятся на одном уровне. Для такого дерева Комлосом был показан вариант алгоритма, который находит ребро с максимальным весом на пути для каждой пары листьев, используя &amp;lt;math&amp;gt;O\left(n\log\left(\frac{m+n}{n}\right)\right)&amp;lt;/math&amp;gt; операций сравнения. Алгоритм разбивает путь между листьями на две части, начинающихся в листе и заканчивающихся в наименьшем общем предке этих листьев, и находит ребро с наибольшим весом в каждой части. После чего, одно из двух рёбер с большим весом выбирается ребром с наибольшим весом на пути из одной вершины в другую.&lt;br /&gt;
&lt;br /&gt;
Алгоритм вычисляет вес для каждой части пути следующим образом. Пусть &amp;lt;math&amp;gt;A(v, l)&amp;lt;/math&amp;gt; {{---}} ребро максимального веса на пути из корня в некоторый лист &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;, проходящий через вершину &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, ограниченном на отрезке &amp;lt;math&amp;gt;[v, l]&amp;lt;/math&amp;gt; (т.е. удалены все вершины от корня до предка v). Обозначим &amp;lt;math&amp;gt;A(v) = \{A(v, l) | l \text{ содержится в поддереве с корнем } v\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Предположим, что &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; {{---}} вершина-потомок &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, и известно множество &amp;lt;math&amp;gt;A(s) = \{A(s, l_1), A(s, l_2),\dots\}&amp;lt;/math&amp;gt;. Рассмотрим случай одного листа &amp;lt;math&amp;gt;l_i&amp;lt;/math&amp;gt;. Очевидно, что все пути из корня в &amp;lt;math&amp;gt;l_i&amp;lt;/math&amp;gt;, проходящие через &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, также проходят через &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;. Так как ребро &amp;lt;math&amp;gt;\{v, s\}&amp;lt;/math&amp;gt; связывает &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, получим, что &amp;lt;math&amp;gt;A(v, l_i) = \arg\max\{w(A(s, l_i)), w(\{v, s\})\}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w(e)&amp;lt;/math&amp;gt; - вес ребра &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt;. Следовательно, для того, чтобы найти &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt;, достаточно сравнить веса рёбер из &amp;lt;math&amp;gt;A(s)&amp;lt;/math&amp;gt; с весом ребра &amp;lt;math&amp;gt;\{v, s\}&amp;lt;/math&amp;gt;. Данное сравнение можно эффективно выполнить с помощью двоичного поиска.  Итоговое множество &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt; получается путем объединением множеств рёбер, полученных для каждого потомка. &lt;br /&gt;
&lt;br /&gt;
Комлос показал, что &amp;lt;math&amp;gt;\sum\limits_{v\in T} \log |A(v)| = O\left(|V_T|\log\left(\frac{|E_T|+|V_T|}{|V_T|}\right)\right)&amp;lt;/math&amp;gt;, что дает верхнюю границу для количества операций сравнений, используемых алгоритмом.&lt;br /&gt;
==== Эффективная реализация при помощи битового сжатия ====&lt;br /&gt;
В работе Валери Кинг был предложен [[Алгоритм Кинг|метод сведения общего случая остовного дерева к полному ветвящемуся дереву]], а также предложена эффективная реализация алгоритма Комлоса с использованием битового сжатия&amp;lt;ref name=&amp;quot;kingalg&amp;quot;&amp;gt;King, V. A simpler minimum spanning tree verification algorithm. Algorithmica 18, 263–270 (1997). https://doi.org/10.1007/BF02526037&amp;lt;/ref&amp;gt;. Описанные в работе структуры данных и битовые операции, которые возможно предвычислить и сохранить в таблице, обращение к которой занимает константное количество операций, позволяют выполнить алгоритм Комлоса за линейное время.&lt;br /&gt;
&lt;br /&gt;
Обозначим за &amp;lt;math&amp;gt;T=(V, E)&amp;lt;/math&amp;gt; полное ветвящееся дерево, полученное с помощью [[Алгоритм Кинг|алгоритма Кинг]]. Вершины в дереве нумеруются битовыми словами следующим образом:&lt;br /&gt;
# Каждый лист помечается порядковым номером 0, 1, 2... в двоичном представлении в порядке встречи листов при [[Обход_в_глубину,_цвета_вершин|обходе в глубину]].&lt;br /&gt;
# Каждый не-лист помечается номером своего потомка, содержащим наибольшее количество ведущих нулей.&lt;br /&gt;
Рёбра в дереве получают тег, который формируется следующим образом. Рассмотрим ребро &amp;lt;math&amp;gt;e = \{u, v\}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится дальше от корня. Пусть &amp;lt;math&amp;gt;d(v)&amp;lt;/math&amp;gt; обозначает расстояние от вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; до корня, а &amp;lt;math&amp;gt;i(v)&amp;lt;/math&amp;gt; {{---}} номер младшей единицы в номере вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;. Тогда тег ребра &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; {{---}} строка размера &amp;lt;math&amp;gt;\lceil\lg\lg |V|\rceil&amp;lt;/math&amp;gt;, записанная как последовательность &amp;lt;math&amp;gt;&amp;lt;d(v), i(v)&amp;gt;&amp;lt;/math&amp;gt;. В оригинальной работе было показано, что имея тег ребра и номер вершины, можно обнаружить ребро в графе за константное время.&lt;br /&gt;
&lt;br /&gt;
Для каждой вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; создается вектор длины &amp;lt;math&amp;gt;\lceil\lg|V|\rceil&amp;lt;/math&amp;gt;, обозначаемый как &amp;lt;math&amp;gt;LCA(v)&amp;lt;/math&amp;gt;, чей бит с номером i равен 1 тогда, когда существует путь из листа в поддереве с корнем &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; в лист в другом поддереве, наивысшая по уровню вершина которого (иначе говоря, наименьший общий предок двух листьев) находится на расстоянии &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Далее, вершины делятся на два класса. Если &amp;lt;math&amp;gt;|A(v)|&amp;gt;\frac{\lceil\lg|V|\rceil}{\lceil\lg\lg |V|\rceil}&amp;lt;/math&amp;gt;, то вершина &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; считается ''большой''; в противном случае вершина считается ''малой''. Для больших вершин создаются списки &amp;lt;math&amp;gt;bigList&amp;lt;/math&amp;gt;, для малых {{---}} &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt;. &amp;lt;math&amp;gt;BigList&amp;lt;/math&amp;gt; содержит теги рёбер из &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt; в порядке неубывания длин путей из корня в листья, соответствующих рёбрам. Для хранения такого списка требуется &amp;lt;math&amp;gt;\frac{|A(v)|\lceil\lg\lg |V|\rceil}{\lceil\lg|V|\rceil}=O(\log\log |V|)&amp;lt;/math&amp;gt; памяти.&lt;br /&gt;
&lt;br /&gt;
Для малой вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; обозначим за &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; ближайшего большого предка. Список &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt; содержит либо теги рёбер из &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt;, либо, если ребро &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt; содержится в интервале от корня до &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, указатель на &amp;lt;math&amp;gt;bigList&amp;lt;/math&amp;gt; вершины &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, содержащий тег для &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt;. Для каждой малой вершины запоминается номер первого элемента в &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt;, являющимся тегом. Элементы списка, идущие после первого тега, тоже являются тегами. Для хранения &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt; требуется одно битовое слово.&lt;br /&gt;
&lt;br /&gt;
==== Анализ сложности ====&lt;br /&gt;
Было показано, что в реализации с битовым сжатием операции для малых вершин выполняются за константное время. Если вершина большая, то стоимость предвычислений для неё составляет &amp;lt;math&amp;gt;|A(v)|\frac{\lceil\lg\lg |V|\rceil}{\lceil\lg|V|\rceil} = \Omega\left(\log |A(v)|\right)&amp;lt;/math&amp;gt; операций. Следовательно, общая сложность предвычислений составляет &amp;lt;math&amp;gt;O(\log |A(v)|)&amp;lt;/math&amp;gt; операций. Дополнительно алгоритм тратит &amp;lt;math&amp;gt;O(|V|+|E|)&amp;lt;/math&amp;gt; операций для построения списков &amp;lt;math&amp;gt;LCA(v)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;O(|V|)&amp;lt;/math&amp;gt; операций для обработки таблиц с предвычисленными значениями и &amp;lt;math&amp;gt;O(|E|)&amp;lt;/math&amp;gt; операций сравнения для нахождения ребра с максимальным весом из двух половин.&lt;br /&gt;
&lt;br /&gt;
В завершении алгоритма, требуется сравнить веса рёбер графа, которые не входят в остовное дерево, с найденными в остовном дереве рёбрами наибольшего веса, что потребует дополнительных &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; операций сравнения, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; {{---}} количество рёбер в исходном графе.&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* Komlós, J. Linear verification for spanning trees. Combinatorica 5, 57–65 (1985). https://doi.org/10.1007/BF02579443&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D0%B8%D0%BD%D0%B3&amp;diff=82166</id>
		<title>Алгоритм Кинг</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D0%B8%D0%BD%D0%B3&amp;diff=82166"/>
				<updated>2022-01-21T18:41:41Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: Добавлен раздел&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
&lt;br /&gt;
'''Алгоритм Кинг''' {{---}} метод проверки, является ли [[Лемма о безопасном ребре#Необходимые определения | остовное дерево]] неориентированного взвешенного графа [[Лемма о безопасном ребре#Необходимые определения |минимальным]].  Алгоритм имеет линейную сложность, что является преимуществом по сравнению с ранними подходами&amp;lt;ref name=&amp;quot;tarjan&amp;quot;&amp;gt;Tarjan, R.E., 1979. Applications of path compression on balanced trees. Journal of the ACM (JACM), 26(4), pp.690-715.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;drt&amp;quot;&amp;gt;B. Dixon, M. Rauch, and R. Tarjan, Verification and sensitivity analysis of minimum spanning trees in linear time,SIAM J. Comput.,21(6) (1992), 1184–1192.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;komlos&amp;quot;&amp;gt;Komlós, J. Linear verification for spanning trees. Combinatorica 5, 57–65 (1985). https://doi.org/10.1007/BF02579443&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T = (V_T, E_T)&amp;lt;/math&amp;gt; {{---}} остовное дерево неориентированного взвешенного графа &amp;lt;math&amp;gt;G = (V_G, E_G)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Описываемый метод заключается в проверке [[Критерий Тарьяна минимальности остовного дерева|критерия Тарьяна]]: &lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Остовное дерево является минимальным тогда и только тогда, когда вес любого ребра графа, соединяющего вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, не входящего в остовное дерево, больше либо равен весу ребра, имеющего максимальный вес среди ребер входящих в путь между &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; в остовном дереве.&lt;br /&gt;
}}&lt;br /&gt;
Используем следующие обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\{u, v\}&amp;lt;/math&amp;gt; {{---}} ребро, соединяющее вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;T(u, v)&amp;lt;/math&amp;gt; {{---}} множество рёбер, входящих в путь между вершинами &amp;lt;math&amp;gt;u, v&amp;lt;/math&amp;gt; в дереве &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;w(e)&amp;lt;/math&amp;gt; {{---}} вес ребра &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;Heavy(T, u, v) = \arg\max\{w(e) | e\in T(u, v)\}&amp;lt;/math&amp;gt; {{---}} ребро с максимальным весом на пути между вершинами &amp;lt;math&amp;gt;u, v&amp;lt;/math&amp;gt; в дереве &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;.&lt;br /&gt;
Если найти &amp;lt;math&amp;gt;Heavy(T, u, v)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;u, v \in V_T&amp;lt;/math&amp;gt;, то для проверки минимальности остовного дерева достаточно сравнить &amp;lt;math&amp;gt;w(Heavy(T, u, v))&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;w(\{u, v\})&amp;lt;/math&amp;gt; для всех рёбер &amp;lt;math&amp;gt;\{u, v\} \in E_G \setminus E_T&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Построение вспомогательного дерева ===&lt;br /&gt;
Алгоритм строит вспомогательное дерево &amp;lt;math&amp;gt;B = (V_B, E_B)&amp;lt;/math&amp;gt;, являющееся подвешенным и полным ветвящимся (такое дерево, у вершин которого либо 0, либо 2 и более потомков, и в котором все листья находятся на одном уровне), для которого будет выполняться следующее: &amp;lt;math&amp;gt;w(Heavy(B, u, v)) = w(Heavy(T, u, v))&amp;lt;/math&amp;gt; для любой пары вершин &amp;lt;math&amp;gt;u, v \in V_T&amp;lt;/math&amp;gt;. Построение дерева &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; основано на [[Алгоритм Борувки|алгоритме Борувки]]. При инициализации алгоритма для каждой вершины &amp;lt;math&amp;gt;v \in T&amp;lt;/math&amp;gt; создается лист &amp;lt;math&amp;gt;f(v)&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Пусть на некотором шаге алгоритма Борувки алгоритм объединяет множество деревьев &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; в одно дерево, обозначаемое &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. При этом алгоритм выбирает некоторые рёбра с наименьшим весом, прилегающие к деревьям из множества &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Обозначим такое ребро для некоторого дерева &amp;lt;math&amp;gt;a \in A&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;adj(a)&amp;lt;/math&amp;gt;. Тогда алгоритм создает новую вершину &amp;lt;math&amp;gt;f(t)&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;V_B&amp;lt;/math&amp;gt; и добавляет новые рёбра в &amp;lt;math&amp;gt;E_B&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;\{\{f(t), f(a)\} | a \in A\}&amp;lt;/math&amp;gt;. Каждому ребру &amp;lt;math&amp;gt;\{f(t), f(a)\}&amp;lt;/math&amp;gt; присваивается вес выбранного алгоритмом Борувки ребра, т.е. &amp;lt;math&amp;gt;w(\{f(t), f(a)\}) := w(adj(a))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Сложность каждой фазы алгоритма пропорциональна количеству рёбер, не выбранных ранее. Так как &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; является деревом, количество таких рёбер равно количеству деревьев на шаге алгоритма минус один. После каждой фазы количество деревьев сокращается как минимум вдвое, поэтому можно заключить, что построение дерева &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет сложность &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=1&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T = (V_T, E_T)&amp;lt;/math&amp;gt; {{---}} остовное дерево графа, и &amp;lt;math&amp;gt;B = (V_B, E_B)&amp;lt;/math&amp;gt; {{---}} дерево, построенное алгоритмом. Тогда для каждой пары вершин &amp;lt;math&amp;gt;x, y \in V_T&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;w(Heavy(T, x, y)) = w(Heavy(B, f(x), f(y)))&amp;lt;/math&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Вначале покажем, что для каждого ребра &amp;lt;math&amp;gt;e \in B(f(x), f(y))&amp;lt;/math&amp;gt; существует ребро &amp;lt;math&amp;gt;e'\in T(x,y)&amp;lt;/math&amp;gt; для которого верно &amp;lt;math&amp;gt;w(e) \leq w(e')&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;e = \{a, b\}&amp;lt;/math&amp;gt; и, без потери общности, положим, что вершина &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; находится дальше от корня дерева &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, чем &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Тогда &amp;lt;math&amp;gt;a = f(t)&amp;lt;/math&amp;gt; для некоторого дерева &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, построенного на некотором шаге алгоритма Борувки, которое содержит либо &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, либо &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, но не обе вершины одновременно. &lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;e' \in T(x, y)&amp;lt;/math&amp;gt; {{---}} ребро, содержащее ровно одно окончание в дереве &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Так как во время фазы, в которой производился выбор ребра для дерева &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, была возможность выбрать ребро &amp;lt;math&amp;gt;e'&amp;lt;/math&amp;gt;, его вес &amp;lt;math&amp;gt;w(e') \geq w(e)&amp;lt;/math&amp;gt;, что и требовалось показать.  &lt;br /&gt;
&lt;br /&gt;
Остается доказать следующее:&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть ребро &amp;lt;math&amp;gt;e \in T(x,y)&amp;lt;/math&amp;gt; имеет максимальный вес. Тогда существует ребро в &amp;lt;math&amp;gt;B(f(x), f(y))&amp;lt;/math&amp;gt;, имеющее такой же вес.&lt;br /&gt;
}}&lt;br /&gt;
Предположим, что существует единственное ребро в &amp;lt;math&amp;gt;T(x, y)&amp;lt;/math&amp;gt;, имеющее максимальный вес. Доказательство тривиально обобщается на случай нескольких рёбер с максимальным весом. &lt;br /&gt;
&lt;br /&gt;
Если ребро &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; было выбрано алгоритмом Борувки для дерева, которое содержит &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, тогда ребру в &amp;lt;math&amp;gt;B(f(x), f(y))&amp;lt;/math&amp;gt; был присвоен вес &amp;lt;math&amp;gt;w(e)&amp;lt;/math&amp;gt;. Предположим обратное {{---}} ребро &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; было выбрано алгоритмом для дерева, не содержащего вершины &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Одно из окончаний ребра &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; находится в этом дереве, и данная вершина является промежуточной на пути из &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Следовательно, это ребро прилегает к минимум двум другим рёбрам, находящимся на пути из &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Тогда среди этих рёбер &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; является ребром с наибольшим весом, которое не было выбрано, что является противоречием.&lt;br /&gt;
}}&lt;br /&gt;
=== Применение алгоритма Комлоса к вспомогательному дереву ===&lt;br /&gt;
Для полного ветвящегося дерева Комлосом был показан алгоритм&amp;lt;ref name=&amp;quot;komlos&amp;quot;&amp;gt;Komlós, J. Linear verification for spanning trees. Combinatorica 5, 57–65 (1985). https://doi.org/10.1007/BF02579443&amp;lt;/ref&amp;gt;, который находит ребро с максимальным весом на пути для каждой пары вершин, используя &amp;lt;math&amp;gt;O\left(n\log\left(\frac{m+n}{n}\right)\right)&amp;lt;/math&amp;gt; операций сравнения. Алгоритм разбивает путь между вершинами на две части, начинающихся в листе и заканчивающихся в наименьшем общем предке этих вершин, и находит ребро с наибольшим весом в каждой части. После чего, одно из двух рёбер с большим весом выбирается ребром с наибольшим весом на пути из одной вершины в другую.&lt;br /&gt;
&lt;br /&gt;
Алгоритм вычисляет вес для каждой части пути следующим образом. Пусть &amp;lt;math&amp;gt;A(v, l)&amp;lt;/math&amp;gt; {{---}} ребро максимального веса на пути из корня в некоторый лист &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;, проходящий через &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, ограниченном на отрезке &amp;lt;math&amp;gt;[v, l]&amp;lt;/math&amp;gt; (т.е. удалены все вершины от корня до предка v). Обозначим &amp;lt;math&amp;gt;A(v) = \{A(v, l) | l \text{ содержится в поддереве с корнем } v\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Предположим, что &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; {{---}} вершина-потомок &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, и известно множество &amp;lt;math&amp;gt;A(s) = \{A(s, l_1), A(s, l_2),\dots\}&amp;lt;/math&amp;gt;. Рассмотрим случай одного листа &amp;lt;math&amp;gt;l_i&amp;lt;/math&amp;gt;. Очевидно, что все пути из корня в &amp;lt;math&amp;gt;l_i&amp;lt;/math&amp;gt;, проходящие через &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, также проходят через &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;. Так как ребро &amp;lt;math&amp;gt;\{v, s\}&amp;lt;/math&amp;gt; связывает &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, получим, что &amp;lt;math&amp;gt;A(v, l_i) = \arg\max\{w(A(s, l_i)), w(\{v, s\})\}&amp;lt;/math&amp;gt;. Следовательно, для того, чтобы найти &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt;, достаточно сравнить веса рёбер из &amp;lt;math&amp;gt;A(s)&amp;lt;/math&amp;gt; с весом ребра &amp;lt;math&amp;gt;\{v, s\}&amp;lt;/math&amp;gt;. Данное сравнение можно эффективно выполнить с помощью двоичного поиска.  Итоговое множество &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt; получается путем объединением множеств рёбер, полученных для каждого потомка. &lt;br /&gt;
&lt;br /&gt;
Комлос показал, что &amp;lt;math&amp;gt;\sum\limits_{v\in T} \log |A(v)| = O\left(|V_T|\log\left(\frac{|E_T|+|V_T|}{|V_T|}\right)\right)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;komlos&amp;quot;&amp;gt;Komlós, J. Linear verification for spanning trees. Combinatorica 5, 57–65 (1985). https://doi.org/10.1007/BF02579443&amp;lt;/ref&amp;gt;, что дает верхнюю границу для количества операций сравнений, используемых алгоритмом.&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации алгоритма ==&lt;br /&gt;
=== Используемые структуры данных ===&lt;br /&gt;
Реализация алгоритма требует операций над битовыми словами размера порядка &amp;lt;math&amp;gt;O(\log|V_T|)&amp;lt;/math&amp;gt;. Было показано, что рассматриваемые операции возможно предпосчитать за время &amp;lt;math&amp;gt;O(|V_T|)&amp;lt;/math&amp;gt; и сохранить в таблице, обращение к которой занимает &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; операций. Алгоритм пользуется структурами данных, описанными ниже.&lt;br /&gt;
&lt;br /&gt;
Вершины во вспомогательном дереве нумеруются битовыми словами следующим образом:&lt;br /&gt;
# Каждый лист помечается порядковым номером 0, 1, 2... в двоичном представлении в порядке встречи листов при [[Обход_в_глубину,_цвета_вершин|обходе в глубину]].&lt;br /&gt;
# Каждый не-лист помечается номером своего потомка, содержащим наибольшее количество ведущих нулей.&lt;br /&gt;
Рёбра в дереве получают тег, который формируется следующим образом. Рассмотрим ребро &amp;lt;math&amp;gt;e = \{u, v\}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится дальше от корня. Пусть &amp;lt;math&amp;gt;d(v)&amp;lt;/math&amp;gt; обозначает расстояние от вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; до корня, а &amp;lt;math&amp;gt;i(v)&amp;lt;/math&amp;gt; {{---}} номер младшей единицы в номере вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;. Тогда тег ребра &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; {{---}} строка размера &amp;lt;math&amp;gt;\lceil\lg\lg |V_T|\rceil&amp;lt;/math&amp;gt;, записанная как последовательность &amp;lt;math&amp;gt;&amp;lt;d(v), i(v)&amp;gt;&amp;lt;/math&amp;gt;. В оригинальной работе было показано, что имея тег ребра и номер вершины, можно обнаружить ребро в графе за константное время.&lt;br /&gt;
&lt;br /&gt;
Для каждой вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; создается вектор длины &amp;lt;math&amp;gt;\lceil\lg|V_T|\rceil&amp;lt;/math&amp;gt;, обозначаемый как &amp;lt;math&amp;gt;LCA(v)&amp;lt;/math&amp;gt;, чей бит с номером i равен 1 тогда, когда существует путь из листа в поддереве с корнем &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; в лист в другом поддереве, наивысшая по уровню вершина которого (иначе говоря, наименьший общий предок двух листьев) находится на расстоянии &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Далее, вершины делятся на два класса. Если &amp;lt;math&amp;gt;|A(v)|&amp;gt;\frac{\lceil\lg|V_T|\rceil}{\lceil\lg\lg |V_T|\rceil}&amp;lt;/math&amp;gt;, то вершина &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; считается ''большой''; в противном случае вершина считается ''малой''. Для больших вершин создаются списки &amp;lt;math&amp;gt;bigList&amp;lt;/math&amp;gt;, для малых {{---}} &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt;. &amp;lt;math&amp;gt;BigList&amp;lt;/math&amp;gt; содержит теги рёбер из &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt; в порядке неубывания длин путей из корня в листья, соответствующих рёбрам. Для хранения такого списка требуется &amp;lt;math&amp;gt;\frac{|A(v)|\lceil\lg\lg |V_T|\rceil}{\lceil\lg|V_T|\rceil}=O(\log\log |V_T|)&amp;lt;/math&amp;gt; памяти.&lt;br /&gt;
&lt;br /&gt;
Для малой вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; обозначим за &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; ближайшего большого предка. Список &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt; содержит либо теги рёбер из &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt;, либо, если ребро &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt; содержится в интервале от корня до &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, указатель на &amp;lt;math&amp;gt;bigList&amp;lt;/math&amp;gt; вершины &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, содержащий тег для &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt;. Для каждой малой вершины запоминается номер первого элемента в &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt;, являющимся тегом. Элементы списка, идущие после первого тега, тоже являются тегами. Для хранения &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt; требуется одно битовое слово.&lt;br /&gt;
&lt;br /&gt;
Построение и использование структуры данных подробно описано в оригинальной статье. &lt;br /&gt;
&lt;br /&gt;
=== Анализ сложности ===&lt;br /&gt;
Было показано, что сложность построения данных для одной вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; возможно за &amp;lt;math&amp;gt;O\left(\log |A(v)|\right)&amp;lt;/math&amp;gt; операций. Суммируя по всем вершинам, итоговая сложность алгоритма составляет &amp;lt;math&amp;gt;O\left(|V_T|\log\left(\frac{|E_T|+|V_T|}{|V_T|}\right)\right)&amp;lt;/math&amp;gt; операций, что и было показано Комлосом.&lt;br /&gt;
&lt;br /&gt;
Дополнительно алгоритм тратит &amp;lt;math&amp;gt;O(|V_T|+|E_T|)&amp;lt;/math&amp;gt; операций для построения списков &amp;lt;math&amp;gt;LCA(v)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций для обработки таблиц с предвычисленными значениями и &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; операций сравнения для нахождения ребра с максимальным весом из двух половин.&lt;br /&gt;
&lt;br /&gt;
В завершении алгоритма, требуется сравнить веса рёбер графа, которые не входят в остовное дерево, с найденными в дереве &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; рёбрами наибольшего веса, что потребует дополнительных &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; операций сравнения.&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Остовные деревья: определения, лемма о безопасном ребре]]&lt;br /&gt;
* [[Алгоритм Борувки]]&lt;br /&gt;
* [[Критерий Тарьяна минимальности остовного дерева]] &lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* King, V. A simpler minimum spanning tree verification algorithm. Algorithmica 18, 263–270 (1997). https://doi.org/10.1007/BF02526037&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы на графах]]&lt;br /&gt;
[[Категория:Построение остовных деревьев]]&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D0%B8%D0%BD%D0%B3&amp;diff=82165</id>
		<title>Алгоритм Кинг</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D0%B8%D0%BD%D0%B3&amp;diff=82165"/>
				<updated>2022-01-21T18:13:52Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
&lt;br /&gt;
'''Алгоритм Кинг''' {{---}} метод проверки, является ли [[Лемма о безопасном ребре#Необходимые определения | остовное дерево]] неориентированного взвешенного графа [[Лемма о безопасном ребре#Необходимые определения |минимальным]].  Алгоритм имеет линейную сложность, что является преимуществом по сравнению с ранними подходами&amp;lt;ref name=&amp;quot;tarjan&amp;quot;&amp;gt;Tarjan, R.E., 1979. Applications of path compression on balanced trees. Journal of the ACM (JACM), 26(4), pp.690-715.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;drt&amp;quot;&amp;gt;B. Dixon, M. Rauch, and R. Tarjan, Verification and sensitivity analysis of minimum spanning trees in linear time,SIAM J. Comput.,21(6) (1992), 1184–1192.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;komlos&amp;quot;&amp;gt;Komlós, J. Linear verification for spanning trees. Combinatorica 5, 57–65 (1985). https://doi.org/10.1007/BF02579443&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T = (V_T, E_T)&amp;lt;/math&amp;gt; {{---}} остовное дерево неориентированного взвешенного графа &amp;lt;math&amp;gt;G = (V_G, E_G)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Описываемый метод заключается в проверке [[Критерий Тарьяна минимальности остовного дерева|критерия Тарьяна]]: &lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Остовное дерево является минимальным тогда и только тогда, когда вес любого ребра графа, не входящего в остовное дерево, больше либо равен весу ребра, имеющего максимальный вес среди ребер входящих в путь между &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; в остовном дереве.&lt;br /&gt;
}}&lt;br /&gt;
Используем следующие обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;\{u, v\}&amp;lt;/math&amp;gt; {{---}} ребро, соединяющее вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;T(u, v)&amp;lt;/math&amp;gt; {{---}} множество рёбер, входящих в путь между вершинами &amp;lt;math&amp;gt;u, v&amp;lt;/math&amp;gt; в дереве &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;w(e)&amp;lt;/math&amp;gt; {{---}} вес ребра &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;Heavy(T, u, v) = \arg\max\{w(e) | e\in T(u, v)\}&amp;lt;/math&amp;gt; {{---}} ребро с максимальным весом на пути между вершинами &amp;lt;math&amp;gt;u, v&amp;lt;/math&amp;gt; в дереве &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;.&lt;br /&gt;
Если найти &amp;lt;math&amp;gt;Heavy(T, u, v)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;u, v \in V_T&amp;lt;/math&amp;gt;, то для проверки минимальности остовного дерева достаточно сравнить &amp;lt;math&amp;gt;w(Heavy(T, u, v))&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;w(\{u, v\})&amp;lt;/math&amp;gt; для всех рёбер &amp;lt;math&amp;gt;\{u, v\} \in E_G \setminus E_T&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Построение вспомогательного дерева ===&lt;br /&gt;
Алгоритм строит вспомогательное дерево &amp;lt;math&amp;gt;B = (V_B, E_B)&amp;lt;/math&amp;gt;, являющееся подвешенным и полным ветвящимся (такое дерево, у вершин которого либо 0, либо 2 и более потомков, и в котором все листья находятся на одном уровне), для которого будет выполняться следующее: &amp;lt;math&amp;gt;w(Heavy(B, u, v)) = w(Heavy(T, u, v))&amp;lt;/math&amp;gt; для любой пары вершин &amp;lt;math&amp;gt;u, v \in V_T&amp;lt;/math&amp;gt;. Построение дерева &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; основано на [[Алгоритм Борувки|алгоритме Борувки]]. При инициализации алгоритма для каждой вершины &amp;lt;math&amp;gt;v \in T&amp;lt;/math&amp;gt; создается лист &amp;lt;math&amp;gt;f(v)&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Пусть на некотором шаге алгоритма Борувки алгоритм объединяет множество деревьев &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; в одно дерево, обозначаемое &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. При этом алгоритм выбирает некоторые рёбра с наименьшим весом, прилегающие к деревьям из множества &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Обозначим такое ребро для некоторого дерева &amp;lt;math&amp;gt;a \in A&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;adj(a)&amp;lt;/math&amp;gt;. Тогда алгоритм создает новую вершину &amp;lt;math&amp;gt;f(t)&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;V_B&amp;lt;/math&amp;gt; и добавляет новые рёбра в &amp;lt;math&amp;gt;E_B&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;\{\{f(t), f(a)\} | a \in A\}&amp;lt;/math&amp;gt;. Каждому ребру &amp;lt;math&amp;gt;\{f(t), f(a)\}&amp;lt;/math&amp;gt; присваивается вес выбранного алгоритмом Борувки ребра, т.е. &amp;lt;math&amp;gt;w(\{f(t), f(a)\}) := w(adj(a))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Сложность каждой фазы алгоритма пропорциональна количеству рёбер, не выбранных ранее. Так как &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; является деревом, количество таких рёбер равно количеству деревьев на шаге алгоритма минус один. После каждой фазы количество деревьев сокращается как минимум вдвое, поэтому можно заключить, что построение дерева &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет сложность &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=1&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T = (V_T, E_T)&amp;lt;/math&amp;gt; {{---}} остовное дерево графа, и &amp;lt;math&amp;gt;B = (V_B, E_B)&amp;lt;/math&amp;gt; {{---}} дерево, построенное алгоритмом. Тогда для каждой пары вершин &amp;lt;math&amp;gt;x, y \in V_T&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;w(Heavy(T, x, y)) = w(Heavy(B, f(x), f(y)))&amp;lt;/math&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Вначале покажем, что для каждого ребра &amp;lt;math&amp;gt;e \in B(f(x), f(y))&amp;lt;/math&amp;gt; существует ребро &amp;lt;math&amp;gt;e'\in T(x,y)&amp;lt;/math&amp;gt; для которого верно &amp;lt;math&amp;gt;w(e) \leq w(e')&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;e = \{a, b\}&amp;lt;/math&amp;gt; и, без потери общности, положим, что вершина &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; находится дальше от корня дерева &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, чем &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Тогда &amp;lt;math&amp;gt;a = f(t)&amp;lt;/math&amp;gt; для некоторого дерева &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, построенного на некотором шаге алгоритма Борувки, которое содержит либо &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, либо &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, но не обе вершины одновременно. &lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;e' \in T(x, y)&amp;lt;/math&amp;gt; {{---}} ребро, содержащее ровно одно окончание в дереве &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Так как во время фазы, в которой производился выбор ребра для дерева &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, была возможность выбрать ребро &amp;lt;math&amp;gt;e'&amp;lt;/math&amp;gt;, его вес &amp;lt;math&amp;gt;w(e') \geq w(e)&amp;lt;/math&amp;gt;, что и требовалось показать.  &lt;br /&gt;
&lt;br /&gt;
Остается доказать следующее:&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть ребро &amp;lt;math&amp;gt;e \in T(x,y)&amp;lt;/math&amp;gt; имеет максимальный вес. Тогда существует ребро в &amp;lt;math&amp;gt;B(f(x), f(y))&amp;lt;/math&amp;gt;, имеющее такой же вес.&lt;br /&gt;
}}&lt;br /&gt;
Предположим, что существует единственное ребро в &amp;lt;math&amp;gt;T(x, y)&amp;lt;/math&amp;gt;, имеющее максимальный вес. Доказательство тривиально обобщается на случай нескольких рёбер с максимальным весом. &lt;br /&gt;
&lt;br /&gt;
Если ребро &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; было выбрано алгоритмом Борувки для дерева, которое содержит &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, тогда ребру в &amp;lt;math&amp;gt;B(f(x), f(y))&amp;lt;/math&amp;gt; был присвоен вес &amp;lt;math&amp;gt;w(e)&amp;lt;/math&amp;gt;. Предположим обратное {{---}} ребро &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; было выбрано алгоритмом для дерева, не содержащего вершины &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Одно из окончаний ребра &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; находится в этом дереве, и данная вершина является промежуточной на пути из &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Следовательно, это ребро прилегает к минимум двум другим рёбрам, находящимся на пути из &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Тогда среди этих рёбер &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; является ребром с наибольшим весом, которое не было выбрано, что является противоречием.&lt;br /&gt;
}}&lt;br /&gt;
=== Применение алгоритма Комлоса к вспомогательному дереву ===&lt;br /&gt;
Для полного ветвящегося дерева Комлосом был показан алгоритм&amp;lt;ref name=&amp;quot;komlos&amp;quot;&amp;gt;Komlós, J. Linear verification for spanning trees. Combinatorica 5, 57–65 (1985). https://doi.org/10.1007/BF02579443&amp;lt;/ref&amp;gt;, который находит ребро с максимальным весом на пути для каждой пары вершин, используя &amp;lt;math&amp;gt;O\left(n\log\left(\frac{m+n}{n}\right)\right)&amp;lt;/math&amp;gt; операций сравнения. Алгоритм разбивает путь между вершинами на две части, начинающихся в листе и заканчивающихся в наименьшем общем предке этих вершин, и находит ребро с наибольшим весом в каждой части. После чего, одно из двух рёбер с большим весом выбирается ребром с наибольшим весом на пути из одной вершины в другую.&lt;br /&gt;
&lt;br /&gt;
Алгоритм вычисляет вес для каждой части пути следующим образом. Пусть &amp;lt;math&amp;gt;A(v, l)&amp;lt;/math&amp;gt; {{---}} ребро максимального веса на пути из корня в некоторый лист &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;, проходящий через &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, ограниченном на отрезке &amp;lt;math&amp;gt;[v, l]&amp;lt;/math&amp;gt; (т.е. удалены все вершины от корня до предка v). Обозначим &amp;lt;math&amp;gt;A(v) = \{A(v, l) | l \text{ содержится в поддереве с корнем } v\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Предположим, что &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; {{---}} вершина-потомок &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, и известно множество &amp;lt;math&amp;gt;A(s) = \{A(s, l_1), A(s, l_2),\dots\}&amp;lt;/math&amp;gt;. Рассмотрим случай одного листа &amp;lt;math&amp;gt;l_i&amp;lt;/math&amp;gt;. Очевидно, что все пути из корня в &amp;lt;math&amp;gt;l_i&amp;lt;/math&amp;gt;, проходящие через &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, также проходят через &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;. Так как ребро &amp;lt;math&amp;gt;\{v, s\}&amp;lt;/math&amp;gt; связывает &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, получим, что &amp;lt;math&amp;gt;A(v, l_i) = \arg\max\{w(A(s, l_i)), w(\{v, s\})\}&amp;lt;/math&amp;gt;. Следовательно, для того, чтобы найти &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt;, достаточно сравнить веса рёбер из &amp;lt;math&amp;gt;A(s)&amp;lt;/math&amp;gt; с весом ребра &amp;lt;math&amp;gt;\{v, s\}&amp;lt;/math&amp;gt;. Данное сравнение можно эффективно выполнить с помощью двоичного поиска.  Итоговое множество &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt; получается путем объединением множеств рёбер, полученных для каждого потомка. &lt;br /&gt;
&lt;br /&gt;
Комлос показал, что &amp;lt;math&amp;gt;\sum\limits_{v\in T} \log |A(v)| = O\left(|V_T|\log\left(\frac{|E_T|+|V_T|}{|V_T|}\right)\right)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;komlos&amp;quot;&amp;gt;Komlós, J. Linear verification for spanning trees. Combinatorica 5, 57–65 (1985). https://doi.org/10.1007/BF02579443&amp;lt;/ref&amp;gt;, что дает верхнюю границу для количества операций сравнений, используемых алгоритмом.&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации алгоритма ==&lt;br /&gt;
=== Используемые структуры данных ===&lt;br /&gt;
Реализация алгоритма требует операций над битовыми словами размера порядка &amp;lt;math&amp;gt;O(\log|V_T|)&amp;lt;/math&amp;gt;. Было показано, что рассматриваемые операции возможно предпосчитать за время &amp;lt;math&amp;gt;O(|V_T|)&amp;lt;/math&amp;gt; и сохранить в таблице, обращение к которой занимает &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; операций. Алгоритм пользуется структурами данных, описанными ниже.&lt;br /&gt;
&lt;br /&gt;
Вершины во вспомогательном дереве нумеруются битовыми словами следующим образом:&lt;br /&gt;
# Каждый лист помечается порядковым номером 0, 1, 2... в двоичном представлении в порядке встречи листов при [[Обход_в_глубину,_цвета_вершин|обходе в глубину]].&lt;br /&gt;
# Каждый не-лист помечается номером своего потомка, содержащим наибольшее количество ведущих нулей.&lt;br /&gt;
Рёбра в дереве получают тег, который формируется следующим образом. Рассмотрим ребро &amp;lt;math&amp;gt;e = \{u, v\}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится дальше от корня. Пусть &amp;lt;math&amp;gt;d(v)&amp;lt;/math&amp;gt; обозначает расстояние от вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; до корня, а &amp;lt;math&amp;gt;i(v)&amp;lt;/math&amp;gt; {{---}} номер младшей единицы в номере вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;. Тогда тег ребра &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; {{---}} строка размера &amp;lt;math&amp;gt;\lceil\lg\lg |V_T|\rceil&amp;lt;/math&amp;gt;, записанная как последовательность &amp;lt;math&amp;gt;&amp;lt;d(v), i(v)&amp;gt;&amp;lt;/math&amp;gt;. В оригинальной работе было показано, что имея тег ребра и номер вершины, можно обнаружить ребро в графе за константное время.&lt;br /&gt;
&lt;br /&gt;
Для каждой вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; создается вектор длины &amp;lt;math&amp;gt;\lceil\lg|V_T|\rceil&amp;lt;/math&amp;gt;, обозначаемый как &amp;lt;math&amp;gt;LCA(v)&amp;lt;/math&amp;gt;, чей бит с номером i равен 1 тогда, когда существует путь из листа в поддереве с корнем &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; в лист в другом поддереве, наивысшая по уровню вершина которого (иначе говоря, наименьший общий предок двух листьев) находится на расстоянии &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Далее, вершины делятся на два класса. Если &amp;lt;math&amp;gt;|A(v)|&amp;gt;\frac{\lceil\lg|V_T|\rceil}{\lceil\lg\lg |V_T|\rceil}&amp;lt;/math&amp;gt;, то вершина &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; считается ''большой''; в противном случае вершина считается ''малой''. Для больших вершин создаются списки &amp;lt;math&amp;gt;bigList&amp;lt;/math&amp;gt;, для малых {{---}} &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt;. &amp;lt;math&amp;gt;BigList&amp;lt;/math&amp;gt; содержит теги рёбер из &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt; в порядке неубывания длин путей из корня в листья, соответствующих рёбрам. Для хранения такого списка требуется &amp;lt;math&amp;gt;\frac{|A(v)|\lceil\lg\lg |V_T|\rceil}{\lceil\lg|V_T|\rceil}=O(\log\log |V_T|)&amp;lt;/math&amp;gt; памяти.&lt;br /&gt;
&lt;br /&gt;
Для малой вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; обозначим за &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; ближайшего большого предка. Список &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt; содержит либо теги рёбер из &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt;, либо, если ребро &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt; содержится в интервале от корня до &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, указатель на &amp;lt;math&amp;gt;bigList&amp;lt;/math&amp;gt; вершины &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, содержащий тег для &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt;. Для каждой малой вершины запоминается номер первого элемента в &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt;, являющимся тегом. Элементы списка, идущие после первого тега, тоже являются тегами. Для хранения &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt; требуется одно битовое слово.&lt;br /&gt;
&lt;br /&gt;
Построение и использование структуры данных подробно описано в оригинальной статье. &lt;br /&gt;
&lt;br /&gt;
=== Анализ сложности ===&lt;br /&gt;
Было показано, что сложность построения данных для одной вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; возможно за &amp;lt;math&amp;gt;O\left(\log |A(v)|\right)&amp;lt;/math&amp;gt; операций. Суммируя по всем вершинам, итоговая сложность алгоритма составляет &amp;lt;math&amp;gt;O\left(|V_T|\log\left(\frac{|E_T|+|V_T|}{|V_T|}\right)\right)&amp;lt;/math&amp;gt; операций, что и было показано Комлосом.&lt;br /&gt;
&lt;br /&gt;
Дополнительно алгоритм тратит &amp;lt;math&amp;gt;O(|V_T|+|E_T|)&amp;lt;/math&amp;gt; операций для построения списков &amp;lt;math&amp;gt;LCA(v)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций для обработки таблиц с предвычисленными значениями и &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; операций сравнения для нахождения ребра с максимальным весом из двух половин.&lt;br /&gt;
&lt;br /&gt;
В завершении алгоритма, требуется сравнить веса рёбер графа, которые не входят в остовное дерево, с найденными в дереве &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; рёбрами наибольшего веса, что потребует дополнительных &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; операций сравнения.&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* King, V. A simpler minimum spanning tree verification algorithm. Algorithmica 18, 263–270 (1997). https://doi.org/10.1007/BF02526037&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы на графах]]&lt;br /&gt;
[[Категория:Построение остовных деревьев]]&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D0%B8%D0%BD%D0%B3&amp;diff=82164</id>
		<title>Алгоритм Кинг</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D0%B8%D0%BD%D0%B3&amp;diff=82164"/>
				<updated>2022-01-21T17:51:17Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
&lt;br /&gt;
'''Алгоритм Кинг''' {{---}} метод проверки, является ли [[Лемма о безопасном ребре#Необходимые определения | остовное дерево]] неориентированного взвешенного графа [[Лемма о безопасном ребре#Необходимые определения |минимальным]].  Алгоритм имеет линейную сложность, что является преимуществом по сравнению с ранними подходами&amp;lt;ref name=&amp;quot;tarjan&amp;quot;&amp;gt;Tarjan, R.E., 1979. Applications of path compression on balanced trees. Journal of the ACM (JACM), 26(4), pp.690-715.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;drt&amp;quot;&amp;gt;B. Dixon, M. Rauch, and R. Tarjan, Verification and sensitivity analysis of minimum spanning trees in linear time,SIAM J. Comput.,21(6) (1992), 1184–1192.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;komlos&amp;quot;&amp;gt;Komlós, J. Linear verification for spanning trees. Combinatorica 5, 57–65 (1985). https://doi.org/10.1007/BF02579443&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T = (V_T, E_T)&amp;lt;/math&amp;gt; {{---}} остовное дерево неориентированного взвешенного графа &amp;lt;math&amp;gt;G = (V_G, E_G)&amp;lt;/math&amp;gt;. Обозначим как &amp;lt;math&amp;gt;\{u, v\}&amp;lt;/math&amp;gt; ребро, которое соединяет вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;.&lt;br /&gt;
Описываемый метод заключается в проверке [[Критерий Тарьяна минимальности остовного дерева|критерия Тарьяна]]: &lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Остовное дерево является минимальным тогда и только тогда, когда вес любого ребра графа &amp;lt;math&amp;gt;\{u, v\}&amp;lt;/math&amp;gt;, не входящего в остовное дерево, больше либо равен весу ребра, имеющего максимальный вес среди ребер входящих в путь между &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; в остовном дереве.&lt;br /&gt;
}}&lt;br /&gt;
Используем следующие обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;T(u, v)&amp;lt;/math&amp;gt; {{---}} множество рёбер, входящих в путь между вершинами &amp;lt;math&amp;gt;u, v&amp;lt;/math&amp;gt; в дереве &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;w(e)&amp;lt;/math&amp;gt; {{---}} вес ребра &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;Heavy(T, u, v) = \arg\max\{w(e) | e\in T(u, v)\}&amp;lt;/math&amp;gt; {{---}} ребро с максимальным весом на пути между вершинами &amp;lt;math&amp;gt;u, v&amp;lt;/math&amp;gt; в дереве &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;.&lt;br /&gt;
Если найти &amp;lt;math&amp;gt;Heavy(T, u, v)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;u, v \in V_T&amp;lt;/math&amp;gt;, то для проверки минимальности остовного дерева достаточно сравнить &amp;lt;math&amp;gt;w(Heavy(T, u, v))&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;w(\{u, v\})&amp;lt;/math&amp;gt; для всех рёбер &amp;lt;math&amp;gt;\{u, v\} \in E_G \setminus E_T&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Построение вспомогательного дерева ===&lt;br /&gt;
Алгоритм строит вспомогательное дерево &amp;lt;math&amp;gt;B = (V_B, E_B)&amp;lt;/math&amp;gt;, являющееся подвешенным и полным ветвящимся (такое дерево, у вершин которого либо 0, либо 2 и более потомков, и в котором все листья находятся на одном уровне), для которого будет выполняться следующее: &amp;lt;math&amp;gt;w(Heavy(B, u, v)) = w(Heavy(T, u, v))&amp;lt;/math&amp;gt; для любой пары вершин &amp;lt;math&amp;gt;u, v \in V_T&amp;lt;/math&amp;gt;. Построение дерева &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; основано на [[Алгоритм Борувки|алгоритме Борувки]]. При инициализации алгоритма для каждой вершины &amp;lt;math&amp;gt;v \in T&amp;lt;/math&amp;gt; создается лист &amp;lt;math&amp;gt;f(v)&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Пусть на некотором шаге алгоритма Борувки алгоритм объединяет множество деревьев &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; в одно дерево, обозначаемое &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. При этом алгоритм выбирает некоторые рёбра с наименьшим весом, прилегающие к деревьям из множества &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Обозначим такое ребро для некоторого дерева &amp;lt;math&amp;gt;a \in A&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;adj(a)&amp;lt;/math&amp;gt;. Тогда алгоритм создает новую вершину &amp;lt;math&amp;gt;f(t)&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;V_B&amp;lt;/math&amp;gt; и добавляет новые рёбра в &amp;lt;math&amp;gt;E_B&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;\{\{f(t), f(a)\} | a \in A\}&amp;lt;/math&amp;gt;. Каждому ребру &amp;lt;math&amp;gt;\{f(t), f(a)\}&amp;lt;/math&amp;gt; присваивается вес выбранного алгоритмом Борувки ребра, т.е. &amp;lt;math&amp;gt;w(\{f(t), f(a)\}) := w(adj(a))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Сложность каждой фазы алгоритма пропорциональна количеству рёбер, не выбранных ранее. Так как &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; является деревом, количество таких рёбер равно количеству деревьев на шаге алгоритма минус один. После каждой фазы количество деревьев сокращается как минимум вдвое, поэтому можно заключить, что построение дерева &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет сложность &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=1&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T = (V_T, E_T)&amp;lt;/math&amp;gt; {{---}} остовное дерево графа, и &amp;lt;math&amp;gt;B = (V_B, E_B)&amp;lt;/math&amp;gt; {{---}} дерево, построенное алгоритмом. Тогда для каждой пары вершин &amp;lt;math&amp;gt;x, y \in V_T&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;w(Heavy(T, x, y)) = w(Heavy(B, f(x), f(y)))&amp;lt;/math&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Вначале покажем, что для каждого ребра &amp;lt;math&amp;gt;e \in B(f(x), f(y))&amp;lt;/math&amp;gt; существует ребро &amp;lt;math&amp;gt;e'\in T(x,y)&amp;lt;/math&amp;gt; для которого верно &amp;lt;math&amp;gt;w(e) \leq w(e')&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;e = \{a, b\}&amp;lt;/math&amp;gt; и, без потери общности, положим, что вершина &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; находится дальше от корня дерева &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, чем &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Тогда &amp;lt;math&amp;gt;a = f(t)&amp;lt;/math&amp;gt; для некоторого дерева &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, построенного на некотором шаге алгоритма Борувки, которое содержит либо &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, либо &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, но не обе вершины одновременно. &lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;e' \in T(x, y)&amp;lt;/math&amp;gt; {{---}} ребро, содержащее ровно одно окончание в дереве &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Так как во время фазы, в которой производился выбор ребра для дерева &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, была возможность выбрать ребро &amp;lt;math&amp;gt;e'&amp;lt;/math&amp;gt;, его вес &amp;lt;math&amp;gt;w(e') \geq w(e)&amp;lt;/math&amp;gt;, что и требовалось показать.  &lt;br /&gt;
&lt;br /&gt;
Остается доказать следующее:&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть ребро &amp;lt;math&amp;gt;e \in T(x,y)&amp;lt;/math&amp;gt; имеет максимальный вес. Тогда существует ребро в &amp;lt;math&amp;gt;B(f(x), f(y))&amp;lt;/math&amp;gt;, имеющее такой же вес.&lt;br /&gt;
}}&lt;br /&gt;
Предположим, что существует единственное ребро в &amp;lt;math&amp;gt;T(x, y)&amp;lt;/math&amp;gt;, имеющее максимальный вес. Доказательство тривиально обобщается на случай нескольких рёбер с максимальным весом. &lt;br /&gt;
&lt;br /&gt;
Если ребро &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; было выбрано алгоритмом Борувки для дерева, которое содержит &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, тогда ребру в &amp;lt;math&amp;gt;B(f(x), f(y))&amp;lt;/math&amp;gt; был присвоен вес &amp;lt;math&amp;gt;w(e)&amp;lt;/math&amp;gt;. Предположим обратное {{---}} ребро &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; было выбрано алгоритмом для дерева, не содержащего вершины &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Одно из окончаний ребра &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; находится в этом дереве, и данная вершина является промежуточной на пути из &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Следовательно, это ребро прилегает к минимум двум другим рёбрам, находящимся на пути из &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Тогда среди этих рёбер &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; является ребром с наибольшим весом, которое не было выбрано, что является противоречием.&lt;br /&gt;
}}&lt;br /&gt;
=== Применение алгоритма Комлоса к вспомогательному дереву ===&lt;br /&gt;
Для полного ветвящегося дерева Комлосом был показан алгоритм&amp;lt;ref name=&amp;quot;komlos&amp;quot;&amp;gt;Komlós, J. Linear verification for spanning trees. Combinatorica 5, 57–65 (1985). https://doi.org/10.1007/BF02579443&amp;lt;/ref&amp;gt;, который находит ребро с максимальным весом на пути для каждой пары вершин, используя &amp;lt;math&amp;gt;O\left(n\log\left(\frac{m+n}{n}\right)\right)&amp;lt;/math&amp;gt; операций сравнения. Алгоритм разбивает путь между вершинами на две части, начинающихся в листе и заканчивающихся в наименьшем общем предке этих вершин, и находит ребро с наибольшим весом в каждой части. После чего, одно из двух рёбер с большим весом выбирается ребром с наибольшим весом на пути из одной вершины в другую.&lt;br /&gt;
&lt;br /&gt;
Алгоритм вычисляет вес для каждой части пути следующим образом. Пусть &amp;lt;math&amp;gt;A(v, l)&amp;lt;/math&amp;gt; {{---}} ребро максимального веса на пути из корня в некоторый лист &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;, проходящий через &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, ограниченном на отрезке &amp;lt;math&amp;gt;[v, l]&amp;lt;/math&amp;gt; (т.е. удалены все вершины от корня до предка v). Обозначим &amp;lt;math&amp;gt;A(v) = \{A(v, l) | l \text{ содержится в поддереве с корнем } v\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Предположим, что &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; {{---}} вершина-потомок &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, и известно множество &amp;lt;math&amp;gt;A(s) = \{A(s, l_1), A(s, l_2),\dots\}&amp;lt;/math&amp;gt;. Рассмотрим случай одного листа &amp;lt;math&amp;gt;l_i&amp;lt;/math&amp;gt;. Очевидно, что все пути из корня в &amp;lt;math&amp;gt;l_i&amp;lt;/math&amp;gt;, проходящие через &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, также проходят через &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;. Так как ребро &amp;lt;math&amp;gt;\{v, s\}&amp;lt;/math&amp;gt; связывает &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, получим, что &amp;lt;math&amp;gt;A(v, l_i) = \arg\max\{w(A(s, l_i)), w(\{v, s\})\}&amp;lt;/math&amp;gt;. Следовательно, для того, чтобы найти &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt;, достаточно сравнить веса рёбер из &amp;lt;math&amp;gt;A(s)&amp;lt;/math&amp;gt; с весом ребра &amp;lt;math&amp;gt;\{v, s\}&amp;lt;/math&amp;gt;. Данное сравнение можно эффективно выполнить с помощью двоичного поиска.  Итоговое множество &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt; получается путем объединением множеств рёбер, полученных для каждого потомка. &lt;br /&gt;
&lt;br /&gt;
Комлос показал, что &amp;lt;math&amp;gt;\sum\limits_{v\in T} \log |A(v)| = O\left(|V_T|\log\left(\frac{|E_T|+|V_T|}{|V_T|}\right)\right)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;komlos&amp;quot;&amp;gt;Komlós, J. Linear verification for spanning trees. Combinatorica 5, 57–65 (1985). https://doi.org/10.1007/BF02579443&amp;lt;/ref&amp;gt;, что дает верхнюю границу для количества операций сравнений, используемых алгоритмом.&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации алгоритма ==&lt;br /&gt;
=== Используемые структуры данных ===&lt;br /&gt;
Реализация алгоритма требует операций над битовыми словами размера порядка &amp;lt;math&amp;gt;O(\log|V_T|)&amp;lt;/math&amp;gt;. Было показано, что рассматриваемые операции возможно предпосчитать за время &amp;lt;math&amp;gt;O(|V_T|)&amp;lt;/math&amp;gt; и сохранить в таблице, обращение к которой занимает &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; операций. Алгоритм пользуется структурами данных, описанными ниже.&lt;br /&gt;
&lt;br /&gt;
Вершины во вспомогательном дереве нумеруются битовыми словами следующим образом:&lt;br /&gt;
# Каждый лист помечается порядковым номером 0, 1, 2... в двоичном представлении в порядке встречи листов при [[Обход_в_глубину,_цвета_вершин|обходе в глубину]].&lt;br /&gt;
# Каждый не-лист помечается номером своего потомка, содержащим наибольшее количество ведущих нулей.&lt;br /&gt;
Рёбра в дереве получают тег, который формируется следующим образом. Рассмотрим ребро &amp;lt;math&amp;gt;e = \{u, v\}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится дальше от корня. Пусть &amp;lt;math&amp;gt;d(v)&amp;lt;/math&amp;gt; обозначает расстояние от вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; до корня, а &amp;lt;math&amp;gt;i(v)&amp;lt;/math&amp;gt; {{---}} номер младшей единицы в номере вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;. Тогда тег ребра &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; {{---}} строка размера &amp;lt;math&amp;gt;\lceil\lg\lg |V_T|\rceil&amp;lt;/math&amp;gt;, записанная как последовательность &amp;lt;math&amp;gt;&amp;lt;d(v), i(v)&amp;gt;&amp;lt;/math&amp;gt;. В оригинальной работе было показано, что имея тег ребра и номер вершины, можно обнаружить ребро в графе за константное время.&lt;br /&gt;
&lt;br /&gt;
Для каждой вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; создается вектор длины &amp;lt;math&amp;gt;\lceil\lg|V_T|\rceil&amp;lt;/math&amp;gt;, обозначаемый как &amp;lt;math&amp;gt;LCA(v)&amp;lt;/math&amp;gt;, чей бит с номером i равен 1 тогда, когда существует путь из листа в поддереве с корнем &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; в лист в другом поддереве, наивысшая по уровню вершина которого (иначе говоря, наименьший общий предок двух листьев) находится на расстоянии &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Далее, вершины делятся на два класса. Если &amp;lt;math&amp;gt;|A(v)|&amp;gt;\frac{\lceil\lg|V_T|\rceil}{\lceil\lg\lg |V_T|\rceil}&amp;lt;/math&amp;gt;, то вершина &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; считается ''большой''; в противном случае вершина считается ''малой''. Для больших вершин создаются списки &amp;lt;math&amp;gt;bigList&amp;lt;/math&amp;gt;, для малых {{---}} &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt;. &amp;lt;math&amp;gt;BigList&amp;lt;/math&amp;gt; содержит теги рёбер из &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt; в порядке неубывания длин путей из корня в листья, соответствующих рёбрам. Для хранения такого списка требуется &amp;lt;math&amp;gt;\frac{|A(v)|\lceil\lg\lg |V_T|\rceil}{\lceil\lg|V_T|\rceil}=O(\log\log |V_T|)&amp;lt;/math&amp;gt; памяти.&lt;br /&gt;
&lt;br /&gt;
Для малой вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; обозначим за &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; ближайшего большого предка. Список &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt; содержит либо теги рёбер из &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt;, либо, если ребро &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt; содержится в интервале от корня до &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, указатель на &amp;lt;math&amp;gt;bigList&amp;lt;/math&amp;gt; вершины &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, содержащий тег для &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt;. Для каждой малой вершины запоминается номер первого элемента в &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt;, являющимся тегом. Элементы списка, идущие после первого тега, тоже являются тегами. Для хранения &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt; требуется одно битовое слово.&lt;br /&gt;
&lt;br /&gt;
Построение и использование структуры данных подробно описано в оригинальной статье. &lt;br /&gt;
&lt;br /&gt;
=== Анализ сложности ===&lt;br /&gt;
Было показано, что сложность построения данных для одной вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; возможно за &amp;lt;math&amp;gt;O\left(\log |A(v)|\right)&amp;lt;/math&amp;gt; операций. Суммируя по всем вершинам, итоговая сложность алгоритма составляет &amp;lt;math&amp;gt;O\left(|V_T|\log\left(\frac{|E_T|+|V_T|}{|V_T|}\right)\right)&amp;lt;/math&amp;gt; операций, что и было показано Комлосом.&lt;br /&gt;
&lt;br /&gt;
Дополнительно алгоритм тратит &amp;lt;math&amp;gt;O(|V_T|+|E_T|)&amp;lt;/math&amp;gt; операций для построения списков &amp;lt;math&amp;gt;LCA(v)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций для обработки таблиц с предвычисленными значениями и &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; операций сравнения для нахождения ребра с максимальным весом из двух половин.&lt;br /&gt;
&lt;br /&gt;
В завершении алгоритма, требуется сравнить веса рёбер графа, которые не входят в остовное дерево, с найденными в дереве &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; рёбрами наибольшего веса, что потребует дополнительных &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; операций сравнения.&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* King, V. A simpler minimum spanning tree verification algorithm. Algorithmica 18, 263–270 (1997). https://doi.org/10.1007/BF02526037&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы на графах]]&lt;br /&gt;
[[Категория:Построение остовных деревьев]]&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D0%B8%D0%BD%D0%B3&amp;diff=82163</id>
		<title>Алгоритм Кинг</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D0%B8%D0%BD%D0%B3&amp;diff=82163"/>
				<updated>2022-01-21T17:40:44Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
&lt;br /&gt;
'''Алгоритм Кинг''' {{---}} метод проверки, является ли [[Лемма о безопасном ребре#Необходимые определения | остовное дерево]] неориентированного взвешенного графа [[Лемма о безопасном ребре#Необходимые определения |минимальным]].  Алгоритм имеет линейную сложность, что является преимуществом по сравнению с ранними подходами&amp;lt;ref name=&amp;quot;tarjan&amp;quot;&amp;gt;Tarjan, R.E., 1979. Applications of path compression on balanced trees. Journal of the ACM (JACM), 26(4), pp.690-715.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;drt&amp;quot;&amp;gt;B. Dixon, M. Rauch, and R. Tarjan, Verification and sensitivity analysis of minimum spanning trees in linear time,SIAM J. Comput.,21(6) (1992), 1184–1192.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;komlos&amp;quot;&amp;gt;Komlós, J. Linear verification for spanning trees. Combinatorica 5, 57–65 (1985). https://doi.org/10.1007/BF02579443&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T = (V_T, E_T)&amp;lt;/math&amp;gt; {{---}} остовное дерево неориентированного взвешенного графа &amp;lt;math&amp;gt;G = (V_G, E_G)&amp;lt;/math&amp;gt;. Обозначим как &amp;lt;math&amp;gt;\{u, v\}&amp;lt;/math&amp;gt; ребро, которое соединяет вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;.&lt;br /&gt;
Описываемый метод заключается в проверке [[Критерий Тарьяна минимальности остовного дерева|критерия Тарьяна]]: &lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Остовное дерево является минимальным тогда и только тогда, когда вес любого ребра графа &amp;lt;math&amp;gt;\{u, v\}&amp;lt;/math&amp;gt;, не входящего в остовное дерево, больше либо равен весу ребра, имеющего максимальный вес среди ребер входящих в путь между &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; в остовном дереве.&lt;br /&gt;
}}&lt;br /&gt;
Используем следующие обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;T(u, v)&amp;lt;/math&amp;gt; {{---}} множество рёбер, входящих в путь между вершинами &amp;lt;math&amp;gt;u, v&amp;lt;/math&amp;gt; в дереве &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;w(e)&amp;lt;/math&amp;gt; {{---}} вес ребра &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;Heavy(T, u, v) = \arg\max\{w(e) | e\in T(u, v)\}&amp;lt;/math&amp;gt; {{---}} ребро с максимальным весом на пути между вершинами &amp;lt;math&amp;gt;u, v&amp;lt;/math&amp;gt; в дереве &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;.&lt;br /&gt;
Если найти &amp;lt;math&amp;gt;Heavy(T, u, v)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;u, v \in V_T&amp;lt;/math&amp;gt;, то для проверки минимальности остовного дерева достаточно сравнить &amp;lt;math&amp;gt;w(Heavy(T, u, v))&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;w(\{u, v\})&amp;lt;/math&amp;gt; для всех рёбер &amp;lt;math&amp;gt;\{u, v\} \in E_G \setminus E_T&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Построение вспомогательного дерева ===&lt;br /&gt;
Алгоритм строит вспомогательное дерево &amp;lt;math&amp;gt;B = (V_B, E_B)&amp;lt;/math&amp;gt;, являющееся подвешенным и полным ветвящимся (такое дерево, у вершин которого либо 0, либо 2 и более потомка, и в котором все листья находятся на одном уровне), для которого будет выполняться следующее: &amp;lt;math&amp;gt;w(Heavy(B, u, v)) = w(Heavy(T, u, v))&amp;lt;/math&amp;gt; для любой пары вершин &amp;lt;math&amp;gt;u, v \in V_T&amp;lt;/math&amp;gt;. Построение дерева &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; основано на [[Алгоритм Борувки|алгоритме Борувки]]. При инициализации алгоритма для каждой вершины &amp;lt;math&amp;gt;v \in T&amp;lt;/math&amp;gt; создается лист &amp;lt;math&amp;gt;f(v)&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Пусть на некотором шаге алгоритма Борувки алгоритм объединяет множество деревьев &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; в одно дерево, обозначаемое &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. При этом алгоритм выбирает некоторые рёбра с наименьшим весом, прилегающие к деревьям из множества &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Обозначим такое ребро для некоторого дерева &amp;lt;math&amp;gt;a \in A&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;adj(a)&amp;lt;/math&amp;gt;. Тогда алгоритм создает новую вершину &amp;lt;math&amp;gt;f(t)&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;V_B&amp;lt;/math&amp;gt; и добавляет новые рёбра в &amp;lt;math&amp;gt;E_B&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;\{\{f(t), f(a)\} | a \in A\}&amp;lt;/math&amp;gt;. Каждому ребру &amp;lt;math&amp;gt;\{f(t), f(a)\}&amp;lt;/math&amp;gt; присваивается вес выбранного алгоритмом Борувки ребра, т.е. &amp;lt;math&amp;gt;w(\{f(t), f(a)\}) := w(adj(a))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Сложность каждой фазы алгоритма пропорциональна количеству рёбер, не выбранных ранее. Так как &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; является деревом, количество таких рёбер равно количеству деревьев на шаге алгоритма минус один. После каждой фазы количество деревьев сокращается как минимум вдвое, поэтому можно заключить, что построение дерева &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет сложность &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=1&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T = (V_T, E_T)&amp;lt;/math&amp;gt; {{---}} остовное дерево графа, и &amp;lt;math&amp;gt;B = (V_B, E_B)&amp;lt;/math&amp;gt; {{---}} дерево, построенное алгоритмом. Тогда для каждой пары вершин &amp;lt;math&amp;gt;x, y \in V_T&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;w(Heavy(T, x, y)) = w(Heavy(B, f(x), f(y)))&amp;lt;/math&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Вначале покажем, что для каждого ребра &amp;lt;math&amp;gt;e \in B(f(x), f(y))&amp;lt;/math&amp;gt; существует ребро &amp;lt;math&amp;gt;e'\in T(x,y)&amp;lt;/math&amp;gt; для которого верно &amp;lt;math&amp;gt;w(e) \leq w(e')&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;e = \{a, b\}&amp;lt;/math&amp;gt; и, без потери общности, положим, что вершина &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; находится дальше от корня дерева &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, чем &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Тогда &amp;lt;math&amp;gt;a = f(t)&amp;lt;/math&amp;gt; для некоторого дерева &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, построенного на некотором шаге алгоритма Борувки, которое содержит либо &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, либо &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, но не обе вершины одновременно. &lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;e' \in T(x, y)&amp;lt;/math&amp;gt; {{---}} ребро, содержащее ровно одно окончание в дереве &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Так как во время фазы, в которой производился выбор ребра для дерева &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, была возможность выбрать ребро &amp;lt;math&amp;gt;e'&amp;lt;/math&amp;gt;, его вес &amp;lt;math&amp;gt;w(e') \geq w(e)&amp;lt;/math&amp;gt;, что и требовалось показать.  &lt;br /&gt;
&lt;br /&gt;
Остается доказать следующее:&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть ребро &amp;lt;math&amp;gt;e \in T(x,y)&amp;lt;/math&amp;gt; имеет максимальный вес. Тогда существует ребро в &amp;lt;math&amp;gt;B(f(x), f(y))&amp;lt;/math&amp;gt;, имеющее такой же вес.&lt;br /&gt;
}}&lt;br /&gt;
Предположим, что существует единственное ребро в &amp;lt;math&amp;gt;T(x, y)&amp;lt;/math&amp;gt;, имеющее максимальный вес. Доказательство тривиально обобщается на случай нескольких рёбер с максимальным весом. &lt;br /&gt;
&lt;br /&gt;
Если ребро &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; было выбрано алгоритмом Борувки для дерева, которое содержит &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, тогда ребру в &amp;lt;math&amp;gt;B(f(x), f(y))&amp;lt;/math&amp;gt; был присвоен вес &amp;lt;math&amp;gt;w(e)&amp;lt;/math&amp;gt;. Предположим обратное {{---}} ребро &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; было выбрано алгоритмом для дерева, не содержащего вершины &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Одно из окончаний ребра &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; находится в этом дереве, и данная вершина является промежуточной на пути из &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Следовательно, это ребро прилегает к минимум двум другим рёбрам, находящимся на пути из &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Тогда среди этих рёбер &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; является ребром с наибольшим весом, которое не было выбрано, что является противоречием.&lt;br /&gt;
}}&lt;br /&gt;
=== Применение алгоритма Комлоса к вспомогательному дереву ===&lt;br /&gt;
Для полного ветвящегося дерева Комлосом был показан алгоритм&amp;lt;ref name=&amp;quot;komlos&amp;quot;&amp;gt;Komlós, J. Linear verification for spanning trees. Combinatorica 5, 57–65 (1985). https://doi.org/10.1007/BF02579443&amp;lt;/ref&amp;gt;, который находит ребро с максимальным весом на пути для каждой пары вершин, используя &amp;lt;math&amp;gt;O\left(n\log\left(\frac{m+n}{n}\right)\right)&amp;lt;/math&amp;gt; операций сравнения. Алгоритм разбивает путь между вершинами на две части, начинающихся в листе и заканчивающихся в наименьшем общем предке этих вершин, и находит ребро с наибольшим весом в каждой части. После чего, одно из двух рёбер с большим весом выбирается ребром с наибольшим весом на пути из одной вершины в другую.&lt;br /&gt;
&lt;br /&gt;
Алгоритм вычисляет вес для каждой части пути следующим образом. Пусть &amp;lt;math&amp;gt;A(v, l)&amp;lt;/math&amp;gt; {{---}} ребро максимального веса на пути из корня в некоторый лист &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;, проходящий через &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, ограниченном на отрезке &amp;lt;math&amp;gt;[v, l]&amp;lt;/math&amp;gt; (т.е. удалены все вершины от корня до предка v). Обозначим &amp;lt;math&amp;gt;A(v) = \{A(v, l) | l \text{ содержится в поддереве с корнем } v\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Предположим, что &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; {{---}} вершина-потомок &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, и известно множество &amp;lt;math&amp;gt;A(s) = \{A(s, l_1), A(s, l_1),\dots\}&amp;lt;/math&amp;gt;. Рассмотрим случай одного листа &amp;lt;math&amp;gt;l_i&amp;lt;/math&amp;gt;. Очевидно, что все пути из корня в &amp;lt;math&amp;gt;l_i&amp;lt;/math&amp;gt;, проходящие через &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, также проходят через &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;. Так как ребро &amp;lt;math&amp;gt;\{v, s\}&amp;lt;/math&amp;gt; связывает &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, получим, что &amp;lt;math&amp;gt;A(v, l_i) = \arg\max\{w(A(s, l_i)), w(\{v, s\})\}&amp;lt;/math&amp;gt;. Следовательно, для того, чтобы найти &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt;, достаточно сравнить веса рёбер из &amp;lt;math&amp;gt;A(s)&amp;lt;/math&amp;gt; с весом ребра &amp;lt;math&amp;gt;\{v, s\}&amp;lt;/math&amp;gt;. Данное сравнение можно эффективно выполнить с помощью двоичного поиска.  Итоговое множество &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt; получается путем объединением множеств рёбер, полученных для каждого потомка. &lt;br /&gt;
&lt;br /&gt;
Комлос показал, что &amp;lt;math&amp;gt;\sum\limits_{v\in T} \log |A(v)| = O\left(|V_T|\log\left(\frac{|E_T|+|V_T|}{|V_T|}\right)\right)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;komlos&amp;quot;&amp;gt;Komlós, J. Linear verification for spanning trees. Combinatorica 5, 57–65 (1985). https://doi.org/10.1007/BF02579443&amp;lt;/ref&amp;gt;, что дает верхнюю границу для количества операций сравнений, используемых алгоритмом.&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации алгоритма ==&lt;br /&gt;
=== Используемые структуры данных ===&lt;br /&gt;
Реализация алгоритма требует операций над битовыми словами размера порядка &amp;lt;math&amp;gt;O(\log|V_T|)&amp;lt;/math&amp;gt;. Было показано, что рассматриваемые операции возможно предпосчитать за время &amp;lt;math&amp;gt;O(|V_T|)&amp;lt;/math&amp;gt; и сохранить в таблице, обращение к которой занимает &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; операций. Алгоритм пользуется структурами данных, описанными ниже.&lt;br /&gt;
&lt;br /&gt;
Вершины во вспомогательном дереве нумеруются битовыми словами следующим образом:&lt;br /&gt;
# Каждый лист помечается порядковым номером 0, 1, 2... в двоичном представлении в порядке встречи листов при [[Обход_в_глубину,_цвета_вершин|обходе в глубину]].&lt;br /&gt;
# Каждый не-лист помечается номером своего потомка, содержащим наибольшее количество ведущих нулей.&lt;br /&gt;
Рёбра в дереве получают тег, который формируется следующим образом. Рассмотрим ребро &amp;lt;math&amp;gt;e = \{u, v\}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится дальше от корня. Пусть &amp;lt;math&amp;gt;d(v)&amp;lt;/math&amp;gt; обозначает расстояние от вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; до корня, а &amp;lt;math&amp;gt;i(v)&amp;lt;/math&amp;gt; {{---}} номер младшей единицы в номере вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;. Тогда тег ребра &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; {{---}} строка размера &amp;lt;math&amp;gt;\lceil\lg\lg |V_T|\rceil&amp;lt;/math&amp;gt;, записанная как &amp;lt;math&amp;gt;&amp;lt;d(v), i(v)&amp;gt;&amp;lt;/math&amp;gt;. В оригинальной работе было показано, что имея тег ребра и номер вершины, можно обнаружить ребро в графе за константное время.&lt;br /&gt;
&lt;br /&gt;
Для каждой вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; создается вектор длины &amp;lt;math&amp;gt;\lceil\lg|V_T|\rceil&amp;lt;/math&amp;gt;, обозначаемый как &amp;lt;math&amp;gt;LCA(v)&amp;lt;/math&amp;gt;, чей бит с номером i равен 1, когда существует путь из листа в поддереве с корнем &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; в лист в другом поддереве, наивысшая по уровню вершина которого (иначе говоря, наименьший общий предок двух листьев) находится на расстоянии &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Далее, вершины делятся на два класса. Если &amp;lt;math&amp;gt;|A(v)|&amp;gt;\frac{\lceil\lg|V_T|\rceil}{\lceil\lg\lg |V_T|\rceil}&amp;lt;/math&amp;gt;, то вершина &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; считается ''большой''; в противном случае вершина считается ''малой''. Для больших вершин создаются списки &amp;lt;math&amp;gt;bigList&amp;lt;/math&amp;gt;, для малых {{---}} &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt;. &amp;lt;math&amp;gt;BigList&amp;lt;/math&amp;gt; содержит теги рёбер из &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt; в порядке неубывания длин путей из корня в листья, соответствующих рёбрам. Для хранения такого списка требуется &amp;lt;math&amp;gt;\frac{|A(v)|\lceil\lg\lg |V_T|\rceil}{\lceil\lg|V_T|\rceil}=O(\log\log |V_T|)&amp;lt;/math&amp;gt; памяти.&lt;br /&gt;
&lt;br /&gt;
Для малой вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; обозначим за &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; ближайшего большого предка. Список &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt; содержит либо теги рёбер из &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt;, либо, если ребро &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt; содержится в интервале от корня до &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, указатель на &amp;lt;math&amp;gt;bigList&amp;lt;/math&amp;gt; вершины &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, содержащий тег для &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt;. Для каждой малой вершины запоминается номер первого элемента в &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt;, являющимся тегом. Элементы списка, идущие после первого тега, тоже являются тегами. Для хранения &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt; требуется одно битовое слово.&lt;br /&gt;
&lt;br /&gt;
Построение и использование структуры данных подробно описано в оригинальной статье. &lt;br /&gt;
&lt;br /&gt;
=== Анализ сложности ===&lt;br /&gt;
Было показано, что сложность построения данных для одной вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; возможно за &amp;lt;math&amp;gt;O\left(\log |A(v)|\right)&amp;lt;/math&amp;gt; операций. Суммируя по всем вершинам, итоговая сложность алгоритма составляет &amp;lt;math&amp;gt;O\left(|V_T|\log\left(\frac{|E_T|+|V_T|}{|V_T|}\right)\right)&amp;lt;/math&amp;gt; операций, что и было показано Комлосом.&lt;br /&gt;
&lt;br /&gt;
Дополнительно алгоритм тратит &amp;lt;math&amp;gt;O(|V_T|+|E_T|)&amp;lt;/math&amp;gt; операций для построения списков &amp;lt;math&amp;gt;LCA(v)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций для обработки таблиц с предвычисленными значениями и &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; операций сравнения для нахождения ребра с максимальным весом из двух половин.&lt;br /&gt;
&lt;br /&gt;
В завершении алгоритма, требуется сравнить веса рёбер графа, которые не входят в остовное дерево, с найденными в дереве &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; рёбрами наибольшего веса, что потребует дополнительных &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; операций сравнения.&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* King, V. A simpler minimum spanning tree verification algorithm. Algorithmica 18, 263–270 (1997). https://doi.org/10.1007/BF02526037&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы на графах]]&lt;br /&gt;
[[Категория:Построение остовных деревьев]]&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D0%B8%D0%BD%D0%B3&amp;diff=82162</id>
		<title>Алгоритм Кинг</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D0%B8%D0%BD%D0%B3&amp;diff=82162"/>
				<updated>2022-01-21T17:25:13Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: Добавлены категории&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
&lt;br /&gt;
'''Алгоритм Кинг''' {{---}} метод проверки, является ли [[Лемма о безопасном ребре#Необходимые определения | остовное дерево]] неориентированного взвешенного графа [[Лемма о безопасном ребре#Необходимые определения |минимальным]].  Алгоритм имеет линейную сложность, что является преимуществом по сравнению с ранними подходами&amp;lt;ref name=&amp;quot;tarjan&amp;quot;&amp;gt;Tarjan, R.E., 1979. Applications of path compression on balanced trees. Journal of the ACM (JACM), 26(4), pp.690-715.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;drt&amp;quot;&amp;gt;B. Dixon, M. Rauch, and R. Tarjan, Verification and sensitivity analysis of minimum spanning trees in linear time,SIAM J. Comput.,21(6) (1992), 1184–1192.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;komlos&amp;quot;&amp;gt;Komlós, J. Linear verification for spanning trees. Combinatorica 5, 57–65 (1985). https://doi.org/10.1007/BF02579443&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T = (V_T, E_T)&amp;lt;/math&amp;gt; {{---}} остовное дерево неориентированного взвешенного графа &amp;lt;math&amp;gt;G = (V_G, E_G)&amp;lt;/math&amp;gt;. Обозначим как &amp;lt;math&amp;gt;\{u, v\}&amp;lt;/math&amp;gt; ребро, которое соединяет вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;.&lt;br /&gt;
Описываемый метод заключается в проверке [[Критерий Тарьяна минимальности остовного дерева|критерия Тарьяна]]: &lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Остовное дерево является минимальным тогда и только тогда, когда вес любого ребра графа &amp;lt;math&amp;gt;\{u, v\}&amp;lt;/math&amp;gt;, не входящего в остовное дерево, больше либо равен весу ребра, имеющего максимальный вес среди ребер входящих в путь между &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; в остовном дереве.&lt;br /&gt;
}}&lt;br /&gt;
Используем следующие обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;T(u, v)&amp;lt;/math&amp;gt; {{---}} множество рёбер, входящих в путь между вершинами &amp;lt;math&amp;gt;u, v&amp;lt;/math&amp;gt; в дереве &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;w(e)&amp;lt;/math&amp;gt; {{---}} вес ребра &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;Heavy(T, u, v) = \arg\max\{w(e) | e\in T(u, v)\}&amp;lt;/math&amp;gt; {{---}} ребро с максимальным весом на пути между вершинами &amp;lt;math&amp;gt;u, v&amp;lt;/math&amp;gt; в дереве &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;.&lt;br /&gt;
Если найти &amp;lt;math&amp;gt;Heavy(T, u, v)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;u, v \in V_T&amp;lt;/math&amp;gt;, то для проверки минимальности остовного дерева достаточно сравнить &amp;lt;math&amp;gt;w(Heavy(T, u, v))&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;w(\{u, v\})&amp;lt;/math&amp;gt; для всех рёбер &amp;lt;math&amp;gt;\{u, v\} \in E_G \setminus E_T&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Построение вспомогательного дерева ===&lt;br /&gt;
Алгоритм строит вспомогательное дерево &amp;lt;math&amp;gt;B = (V_B, E_B)&amp;lt;/math&amp;gt;, являющееся подвешенным и полным ветвящимся (такое дерево, у вершин которого либо 0, либо 2 и более потомка, и в котором все листья находятся на одном уровне), для которого будет выполняться следующее: &amp;lt;math&amp;gt;w(Heavy(B, u, v)) = w(Heavy(T, u, v))&amp;lt;/math&amp;gt; для любой пары вершин &amp;lt;math&amp;gt;u, v \in V_T&amp;lt;/math&amp;gt;. Построение дерева &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; основано на [[Алгоритм Борувки|алгоритме Борувки]]. При инициализации алгоритма для каждой вершины &amp;lt;math&amp;gt;v \in T&amp;lt;/math&amp;gt; создается лист &amp;lt;math&amp;gt;f(v)&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Пусть на некотором шаге алгоритма Борувки алгоритм объединяет множество деревьев &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; в одно дерево, обозначаемое &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. При этом алгоритм выбирает некоторые рёбра с наименьшим весом, прилегающие к деревьям из множества &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Обозначим такое ребро для некоторого дерева &amp;lt;math&amp;gt;a \in A&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;adj(a)&amp;lt;/math&amp;gt;. Тогда алгоритм создает новую вершину &amp;lt;math&amp;gt;f(t)&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;V_B&amp;lt;/math&amp;gt; и добавляет новые рёбра в &amp;lt;math&amp;gt;E_B&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;\{\{f(t), f(a)\} | a \in A\}&amp;lt;/math&amp;gt;. Каждому ребру &amp;lt;math&amp;gt;\{f(t), f(a)\}&amp;lt;/math&amp;gt; присваивается вес выбранного алгоритмом Борувки ребра, т.е. &amp;lt;math&amp;gt;w(\{f(t), f(a)\}) := w(adj(a))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Сложность каждой фазы алгоритма пропорциональна количеству рёбер, не выбранных ранее. Так как &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; является деревом, количество таких рёбер равно количеству деревьев на шаге алгоритма минус один. После каждой фазы количество деревьев сокращается как минимум вдвое, поэтому можно заключить, что построение дерева &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет сложность &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=1&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T = (V_T, E_T)&amp;lt;/math&amp;gt; {{---}} остовное дерево графа, и &amp;lt;math&amp;gt;B = (V_B, E_B)&amp;lt;/math&amp;gt; {{---}} дерево, построенное алгоритмом, описанным выше. Тогда для каждой пары вершин &amp;lt;math&amp;gt;x, y \in V_T&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;w(Heavy(T, x, y)) = w(Heavy(B, f(x), f(y)))&amp;lt;/math&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Вначале покажем, что для каждого ребра &amp;lt;math&amp;gt;e \in B(f(x), f(y))&amp;lt;/math&amp;gt; существует ребро &amp;lt;math&amp;gt;e'\in T(x,y)&amp;lt;/math&amp;gt; для которого верно &amp;lt;math&amp;gt;w(e) \leq w(e')&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;e = \{a, b\}&amp;lt;/math&amp;gt; и, без потери общности, положим, что вершина &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; находится дальше от корня дерева &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, чем &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Тогда &amp;lt;math&amp;gt;a = f(t)&amp;lt;/math&amp;gt; для некоторого дерева &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, построенного для &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; на некотором шаге алгоритма Борувки, которое содержит либо &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, либо &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, но не обе вершины одновременно. &lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;e' \in T(x, y)&amp;lt;/math&amp;gt; {{---}} ребро, содержащее ровно одно окончание в дереве &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Так как во время фазы, в которой производился выбор ребра для дерева &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, была возможность выбрать ребро &amp;lt;math&amp;gt;e'&amp;lt;/math&amp;gt;, его вес &amp;lt;math&amp;gt;w(e') \geq w(e)&amp;lt;/math&amp;gt;, что и требовалось показать.  &lt;br /&gt;
&lt;br /&gt;
Остается доказать следующее:&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть ребро &amp;lt;math&amp;gt;e \in T(x,y)&amp;lt;/math&amp;gt; имеет максимальный вес. Тогда существует ребро в &amp;lt;math&amp;gt;B(f(x), f(y))&amp;lt;/math&amp;gt;, имеющее такой же вес.&lt;br /&gt;
}}&lt;br /&gt;
Предположим, что существует единственное ребро в &amp;lt;math&amp;gt;T(x, y)&amp;lt;/math&amp;gt;, имеющее максимальный вес. Доказательство тривиально обобщается на случай нескольких рёбер с максимальным весом. &lt;br /&gt;
&lt;br /&gt;
Если ребро &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; было выбрано алгоритмом Борувки для дерева, которое содержит &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, тогда ребру в &amp;lt;math&amp;gt;B(f(x), f(y))&amp;lt;/math&amp;gt; был присвоен вес &amp;lt;math&amp;gt;w(e)&amp;lt;/math&amp;gt;. Предположим обратное {{---}} ребро &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; было выбрано алгоритмом для дерева, не содержащего вершины &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Одно из окончаний ребра &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; находится в этом дереве, и данная вершина является промежуточной на пути из &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Следовательно, это ребро прилегает к двум другим рёбрам, находящимся на пути из &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Тогда среди этих трёх рёбер &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; является ребром с наибольшим весом, которое не было выбрано, что является противоречием.&lt;br /&gt;
}}&lt;br /&gt;
=== Применение алгоритма Комлоса к вспомогательному дереву ===&lt;br /&gt;
Для полного ветвящегося дерева Комлосом был показан алгоритм&amp;lt;ref name=&amp;quot;komlos&amp;quot;&amp;gt;Komlós, J. Linear verification for spanning trees. Combinatorica 5, 57–65 (1985). https://doi.org/10.1007/BF02579443&amp;lt;/ref&amp;gt;, который находит ребро с максимальным весом на пути для каждой пары вершин, используя &amp;lt;math&amp;gt;O\left(n\log\left(\frac{m+n}{n}\right)\right)&amp;lt;/math&amp;gt; операций сравнения. Алгоритм разбивает путь между вершинами на две части, начинающихся в листе и заканчивающихся в наименьшем общем предке этих вершин, и находит ребро с наибольшим весом в каждой части. Ребро с большим весом является ребром с наибольшим весом на пути из одной вершины в другую.&lt;br /&gt;
&lt;br /&gt;
Алгоритм вычисляет вес для каждой части пути следующим образом. Пусть &amp;lt;math&amp;gt;A(v, l)&amp;lt;/math&amp;gt; {{---}} ребро максимального веса на пути из корня в некоторый лист &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;, проходящий через &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, ограниченном на отрезке &amp;lt;math&amp;gt;[v, l]&amp;lt;/math&amp;gt; (т.е. удалены все вершины от корня до предка v). Обозначим &amp;lt;math&amp;gt;A(v) = \{A(v, l) | l \text{ содержится в поддереве с корнем } v\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Предположим, что &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; {{---}} вершина-потомок &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, и известно множество &amp;lt;math&amp;gt;A(s) = \{A(s, l_1), A(s, l_1),\dots\}&amp;lt;/math&amp;gt;. Рассмотрим случай одного листа &amp;lt;math&amp;gt;l_i&amp;lt;/math&amp;gt;. Очевидно, что все пути из корня в &amp;lt;math&amp;gt;l_i&amp;lt;/math&amp;gt;, проходящие через &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, также проходят через &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;. Так как ребро &amp;lt;math&amp;gt;\{v, s\}&amp;lt;/math&amp;gt; связывает &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, получим, что &amp;lt;math&amp;gt;A(v, l_i) = \arg\max\{w(A(s, l_i)), w(\{v, s\})\}&amp;lt;/math&amp;gt;. Следовательно, для того, чтобы найти &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt;, достаточно сравнить веса рёбер из &amp;lt;math&amp;gt;A(s)&amp;lt;/math&amp;gt; с весом ребра &amp;lt;math&amp;gt;\{v, s\}&amp;lt;/math&amp;gt;. Данное сравнение можно эффективно выполнить с помощью двоичного поиска.  Итоговое множество &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt; получается путем объединением множеств рёбер, полученных для каждого потомка. &lt;br /&gt;
&lt;br /&gt;
Комлос показал, что &amp;lt;math&amp;gt;\sum\limits_{v\in T} \log |A(v)| = O\left(|V_T|\log\left(\frac{|E_T|+|V_T|}{|V_T|}\right)\right)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;komlos&amp;quot;&amp;gt;Komlós, J. Linear verification for spanning trees. Combinatorica 5, 57–65 (1985). https://doi.org/10.1007/BF02579443&amp;lt;/ref&amp;gt;, что дает верхнюю границу для количества операций сравнений, используемых алгоритмом.&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации алгоритма ==&lt;br /&gt;
=== Используемые структуры данных ===&lt;br /&gt;
Реализация алгоритма требует операций над битовыми словами размера порядка &amp;lt;math&amp;gt;O(\log|V_T|)&amp;lt;/math&amp;gt;. Было показано, что рассматриваемые операции возможно предпосчитать за время &amp;lt;math&amp;gt;O(|V_T|)&amp;lt;/math&amp;gt; и сохранить в таблице, обращение к которой занимает &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; операций. Алгоритм пользуется структурами данных, описанными ниже.&lt;br /&gt;
&lt;br /&gt;
Вершины во вспомогательном дереве нумеруются битовыми словами следующим образом:&lt;br /&gt;
# Каждый лист помечается порядковым номером 0, 1, 2... в двоичном представлении в порядке встречи листов при [[Обход_в_глубину,_цвета_вершин|обходе в глубину]].&lt;br /&gt;
# Каждый не-лист помечается номером своего потомка, содержащим наибольшее количество ведущих нулей.&lt;br /&gt;
Рёбра в дереве получают тег, который формируется следующим образом. Рассмотрим ребро &amp;lt;math&amp;gt;e = \{u, v\}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится дальше от корня. Пусть &amp;lt;math&amp;gt;d(v)&amp;lt;/math&amp;gt; обозначает расстояние от вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; до корня, а &amp;lt;math&amp;gt;i(v)&amp;lt;/math&amp;gt; {{---}} номер младшей единицы в номере вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;. Тогда тег ребра &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; {{---}} строка размера &amp;lt;math&amp;gt;\lceil\lg\lg |V_T|\rceil&amp;lt;/math&amp;gt;, записанная как &amp;lt;math&amp;gt;&amp;lt;d(v), i(v)&amp;gt;&amp;lt;/math&amp;gt;. В оригинальной работе было показано, что имея тег ребра и номер вершины, можно обнаружить ребро в графе за константное время.&lt;br /&gt;
&lt;br /&gt;
Для каждой вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; создается вектор длины &amp;lt;math&amp;gt;\lceil\lg|V_T|\rceil&amp;lt;/math&amp;gt;, обозначаемый как &amp;lt;math&amp;gt;LCA(v)&amp;lt;/math&amp;gt;, чей бит с номером i равен 1, когда существует путь из листа в поддереве с корнем &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; в лист в другом поддереве, наивысшая по уровню вершина которого (иначе говоря, наименьший общий предок двух листьев) находится на расстоянии &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Далее, вершины делятся на два класса. Если &amp;lt;math&amp;gt;|A(v)|&amp;gt;\frac{\lceil\lg|V_T|\rceil}{\lceil\lg\lg |V_T|\rceil}&amp;lt;/math&amp;gt;, то вершина &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; считается ''большой''; в противном случае вершина считается ''малой''. Для больших вершин создаются списки &amp;lt;math&amp;gt;bigList&amp;lt;/math&amp;gt;, для малых {{---}} &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt;. &amp;lt;math&amp;gt;BigList&amp;lt;/math&amp;gt; содержит теги рёбер из &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt; в порядке неубывания длин путей из корня в листья, соответствующих рёбрам. Для хранения такого списка требуется &amp;lt;math&amp;gt;\frac{|A(v)|\lceil\lg\lg |V_T|\rceil}{\lceil\lg|V_T|\rceil}=O(\log\log |V_T|)&amp;lt;/math&amp;gt; памяти.&lt;br /&gt;
&lt;br /&gt;
Для малой вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; обозначим за &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; ближайшего большого предка. Список &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt; содержит либо теги рёбер из &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt;, либо, если ребро &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt; содержится в интервале от корня до &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, указатель на &amp;lt;math&amp;gt;bigList&amp;lt;/math&amp;gt; вершины &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, содержащий тег для &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt;. Для каждой малой вершины запоминается номер первого элемента в &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt;, являющимся тегом. Элементы списка, идущие после первого тега, тоже являются тегами. Для хранения &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt; требуется одно битовое слово.&lt;br /&gt;
&lt;br /&gt;
Построение и использование структуры данных подробно описано в оригинальной статье. &lt;br /&gt;
&lt;br /&gt;
=== Анализ сложности ===&lt;br /&gt;
Было показано, что сложность построения данных для одной вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; возможно за &amp;lt;math&amp;gt;O\left(\log |A(v)|\right)&amp;lt;/math&amp;gt; операций. Суммируя по всем вершинам, итоговая сложность алгоритма &amp;lt;math&amp;gt;O\left(|V_T|\log\left(\frac{|E_T|+|V_T|}{|V_T|}\right)\right)&amp;lt;/math&amp;gt;, что и было показано Комлосом.&lt;br /&gt;
&lt;br /&gt;
Дополнительно алгоритм тратит &amp;lt;math&amp;gt;O(|V_T|+|E_T|)&amp;lt;/math&amp;gt; операций для построения списков &amp;lt;math&amp;gt;LCA(v)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций для обработки таблиц с предвычисленными значениями и &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; операций сравнения для нахождения ребра с максимальным весом из двух половин.&lt;br /&gt;
&lt;br /&gt;
В завершении алгоритма, требуется сравнить веса рёбер графа, которые не входят в остовное дерево, с найденными в дереве &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; рёбрами наибольшего веса, что потребует дополнительных &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; операций сравнения.&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* King, V. A simpler minimum spanning tree verification algorithm. Algorithmica 18, 263–270 (1997). https://doi.org/10.1007/BF02526037&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы на графах]]&lt;br /&gt;
[[Категория:Построение остовных деревьев]]&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D0%B8%D0%BD%D0%B3&amp;diff=82161</id>
		<title>Алгоритм Кинг</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D0%B8%D0%BD%D0%B3&amp;diff=82161"/>
				<updated>2022-01-21T17:18:22Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: Первая версия статьи&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
&lt;br /&gt;
'''Алгоритм Кинг''' {{---}} метод проверки, является ли [[Лемма о безопасном ребре#Необходимые определения | остовное дерево]] неориентированного взвешенного графа [[Лемма о безопасном ребре#Необходимые определения |минимальным]].  Алгоритм имеет линейную сложность, что является преимуществом по сравнению с ранними подходами&amp;lt;ref name=&amp;quot;tarjan&amp;quot;&amp;gt;Tarjan, R.E., 1979. Applications of path compression on balanced trees. Journal of the ACM (JACM), 26(4), pp.690-715.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;drt&amp;quot;&amp;gt;B. Dixon, M. Rauch, and R. Tarjan, Verification and sensitivity analysis of minimum spanning trees in linear time,SIAM J. Comput.,21(6) (1992), 1184–1192.&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;komlos&amp;quot;&amp;gt;Komlós, J. Linear verification for spanning trees. Combinatorica 5, 57–65 (1985). https://doi.org/10.1007/BF02579443&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T = (V_T, E_T)&amp;lt;/math&amp;gt; {{---}} остовное дерево неориентированного взвешенного графа &amp;lt;math&amp;gt;G = (V_G, E_G)&amp;lt;/math&amp;gt;. Обозначим как &amp;lt;math&amp;gt;\{u, v\}&amp;lt;/math&amp;gt; ребро, которое соединяет вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;.&lt;br /&gt;
Описываемый метод заключается в проверке [[Критерий Тарьяна минимальности остовного дерева|критерия Тарьяна]]: &lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Остовное дерево является минимальным тогда и только тогда, когда вес любого ребра графа &amp;lt;math&amp;gt;\{u, v\}&amp;lt;/math&amp;gt;, не входящего в остовное дерево, больше либо равен весу ребра, имеющего максимальный вес среди ребер входящих в путь между &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; в остовном дереве.&lt;br /&gt;
}}&lt;br /&gt;
Используем следующие обозначения:&lt;br /&gt;
* &amp;lt;math&amp;gt;T(u, v)&amp;lt;/math&amp;gt; {{---}} множество рёбер, входящих в путь между вершинами &amp;lt;math&amp;gt;u, v&amp;lt;/math&amp;gt; в дереве &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;w(e)&amp;lt;/math&amp;gt; {{---}} вес ребра &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;Heavy(T, u, v) = \arg\max\{w(e) | e\in T(u, v)\}&amp;lt;/math&amp;gt; {{---}} ребро с максимальным весом на пути между вершинами &amp;lt;math&amp;gt;u, v&amp;lt;/math&amp;gt; в дереве &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;.&lt;br /&gt;
Если найти &amp;lt;math&amp;gt;Heavy(T, u, v)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;u, v \in V_T&amp;lt;/math&amp;gt;, то для проверки минимальности остовного дерева достаточно сравнить &amp;lt;math&amp;gt;w(Heavy(T, u, v))&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;w(\{u, v\})&amp;lt;/math&amp;gt; для всех рёбер &amp;lt;math&amp;gt;\{u, v\} \in E_G \setminus E_T&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Построение вспомогательного дерева ===&lt;br /&gt;
Алгоритм строит вспомогательное дерево &amp;lt;math&amp;gt;B = (V_B, E_B)&amp;lt;/math&amp;gt;, являющееся подвешенным и полным ветвящимся (такое дерево, у вершин которого либо 0, либо 2 и более потомка, и в котором все листья находятся на одном уровне), для которого будет выполняться следующее: &amp;lt;math&amp;gt;w(Heavy(B, u, v)) = w(Heavy(T, u, v))&amp;lt;/math&amp;gt; для любой пары вершин &amp;lt;math&amp;gt;u, v \in V_T&amp;lt;/math&amp;gt;. Построение дерева &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; основано на [[Алгоритм Борувки|алгоритме Борувки]]. При инициализации алгоритма для каждой вершины &amp;lt;math&amp;gt;v \in T&amp;lt;/math&amp;gt; создается лист &amp;lt;math&amp;gt;f(v)&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Пусть на некотором шаге алгоритма Борувки алгоритм объединяет множество деревьев &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; в одно дерево, обозначаемое &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. При этом алгоритм выбирает некоторые рёбра с наименьшим весом, прилегающие к деревьям из множества &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Обозначим такое ребро для некоторого дерева &amp;lt;math&amp;gt;a \in A&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;adj(a)&amp;lt;/math&amp;gt;. Тогда алгоритм создает новую вершину &amp;lt;math&amp;gt;f(t)&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;V_B&amp;lt;/math&amp;gt; и добавляет новые рёбра в &amp;lt;math&amp;gt;E_B&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;\{\{f(t), f(a)\} | a \in A\}&amp;lt;/math&amp;gt;. Каждому ребру &amp;lt;math&amp;gt;\{f(t), f(a)\}&amp;lt;/math&amp;gt; присваивается вес выбранного алгоритмом Борувки ребра, т.е. &amp;lt;math&amp;gt;w(\{f(t), f(a)\}) := w(adj(a))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Сложность каждой фазы алгоритма пропорциональна количеству рёбер, не выбранных ранее. Так как &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; является деревом, количество таких рёбер равно количеству деревьев на шаге алгоритма минус один. После каждой фазы количество деревьев сокращается как минимум вдвое, поэтому можно заключить, что построение дерева &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет сложность &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=1&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T = (V_T, E_T)&amp;lt;/math&amp;gt; {{---}} остовное дерево графа, и &amp;lt;math&amp;gt;B = (V_B, E_B)&amp;lt;/math&amp;gt; {{---}} дерево, построенное алгоритмом, описанным выше. Тогда для каждой пары вершин &amp;lt;math&amp;gt;x, y \in V_T&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;w(Heavy(T, x, y)) = w(Heavy(B, f(x), f(y)))&amp;lt;/math&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Вначале покажем, что для каждого ребра &amp;lt;math&amp;gt;e \in B(f(x), f(y))&amp;lt;/math&amp;gt; существует ребро &amp;lt;math&amp;gt;e'\in T(x,y)&amp;lt;/math&amp;gt; для которого верно &amp;lt;math&amp;gt;w(e) \leq w(e')&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;e = \{a, b\}&amp;lt;/math&amp;gt; и, без потери общности, положим, что вершина &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; находится дальше от корня дерева &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, чем &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Тогда &amp;lt;math&amp;gt;a = f(t)&amp;lt;/math&amp;gt; для некоторого дерева &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, построенного для &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; на некотором шаге алгоритма Борувки, которое содержит либо &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, либо &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, но не обе вершины одновременно. &lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;e' \in T(x, y)&amp;lt;/math&amp;gt; {{---}} ребро, содержащее ровно одно окончание в дереве &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Так как во время фазы, в которой производился выбор ребра для дерева &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, была возможность выбрать ребро &amp;lt;math&amp;gt;e'&amp;lt;/math&amp;gt;, его вес &amp;lt;math&amp;gt;w(e') \geq w(e)&amp;lt;/math&amp;gt;, что и требовалось показать.  &lt;br /&gt;
&lt;br /&gt;
Остается доказать следующее:&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть ребро &amp;lt;math&amp;gt;e \in T(x,y)&amp;lt;/math&amp;gt; имеет максимальный вес. Тогда существует ребро в &amp;lt;math&amp;gt;B(f(x), f(y))&amp;lt;/math&amp;gt;, имеющее такой же вес.&lt;br /&gt;
}}&lt;br /&gt;
Предположим, что существует единственное ребро в &amp;lt;math&amp;gt;T(x, y)&amp;lt;/math&amp;gt;, имеющее максимальный вес. Доказательство тривиально обобщается на случай нескольких рёбер с максимальным весом. &lt;br /&gt;
&lt;br /&gt;
Если ребро &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; было выбрано алгоритмом Борувки для дерева, которое содержит &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, тогда ребру в &amp;lt;math&amp;gt;B(f(x), f(y))&amp;lt;/math&amp;gt; был присвоен вес &amp;lt;math&amp;gt;w(e)&amp;lt;/math&amp;gt;. Предположим обратное {{---}} ребро &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; было выбрано алгоритмом для дерева, не содержащего вершины &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Одно из окончаний ребра &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; находится в этом дереве, и данная вершина является промежуточной на пути из &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Следовательно, это ребро прилегает к двум другим рёбрам, находящимся на пути из &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Тогда среди этих трёх рёбер &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; является ребром с наибольшим весом, которое не было выбрано, что является противоречием.&lt;br /&gt;
}}&lt;br /&gt;
=== Применение алгоритма Комлоса к вспомогательному дереву ===&lt;br /&gt;
Для полного ветвящегося дерева Комлосом был показан алгоритм&amp;lt;ref name=&amp;quot;komlos&amp;quot;&amp;gt;Komlós, J. Linear verification for spanning trees. Combinatorica 5, 57–65 (1985). https://doi.org/10.1007/BF02579443&amp;lt;/ref&amp;gt;, который находит ребро с максимальным весом на пути для каждой пары вершин, используя &amp;lt;math&amp;gt;O\left(n\log\left(\frac{m+n}{n}\right)\right)&amp;lt;/math&amp;gt; операций сравнения. Алгоритм разбивает путь между вершинами на две части, начинающихся в листе и заканчивающихся в наименьшем общем предке этих вершин, и находит ребро с наибольшим весом в каждой части. Ребро с большим весом является ребром с наибольшим весом на пути из одной вершины в другую.&lt;br /&gt;
&lt;br /&gt;
Алгоритм вычисляет вес для каждой части пути следующим образом. Пусть &amp;lt;math&amp;gt;A(v, l)&amp;lt;/math&amp;gt; {{---}} ребро максимального веса на пути из корня в некоторый лист &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;, проходящий через &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, ограниченном на отрезке &amp;lt;math&amp;gt;[v, l]&amp;lt;/math&amp;gt; (т.е. удалены все вершины от корня до предка v). Обозначим &amp;lt;math&amp;gt;A(v) = \{A(v, l) | l \text{ содержится в поддереве с корнем } v\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Предположим, что &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; {{---}} вершина-потомок &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, и известно множество &amp;lt;math&amp;gt;A(s) = \{A(s, l_1), A(s, l_1),\dots\}&amp;lt;/math&amp;gt;. Рассмотрим случай одного листа &amp;lt;math&amp;gt;l_i&amp;lt;/math&amp;gt;. Очевидно, что все пути из корня в &amp;lt;math&amp;gt;l_i&amp;lt;/math&amp;gt;, проходящие через &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, также проходят через &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;. Так как ребро &amp;lt;math&amp;gt;\{v, s\}&amp;lt;/math&amp;gt; связывает &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, получим, что &amp;lt;math&amp;gt;A(v, l_i) = \arg\max\{w(A(s, l_i)), w(\{v, s\})\}&amp;lt;/math&amp;gt;. Следовательно, для того, чтобы найти &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt;, достаточно сравнить веса рёбер из &amp;lt;math&amp;gt;A(s)&amp;lt;/math&amp;gt; с весом ребра &amp;lt;math&amp;gt;\{v, s\}&amp;lt;/math&amp;gt;. Данное сравнение можно эффективно выполнить с помощью двоичного поиска.  Итоговое множество &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt; получается путем объединением множеств рёбер, полученных для каждого потомка. &lt;br /&gt;
&lt;br /&gt;
Комлос показал, что &amp;lt;math&amp;gt;\sum\limits_{v\in T} \log |A(v)| = O\left(|V_T|\log\left(\frac{|E_T|+|V_T|}{|V_T|}\right)\right)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;komlos&amp;quot;&amp;gt;Komlós, J. Linear verification for spanning trees. Combinatorica 5, 57–65 (1985). https://doi.org/10.1007/BF02579443&amp;lt;/ref&amp;gt;, что дает верхнюю границу для количества операций сравнений, используемых алгоритмом.&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации алгоритма ==&lt;br /&gt;
=== Используемые структуры данных ===&lt;br /&gt;
Реализация алгоритма требует операций над битовыми словами размера порядка &amp;lt;math&amp;gt;O(\log|V_T|)&amp;lt;/math&amp;gt;. Было показано, что рассматриваемые операции возможно предпосчитать за время &amp;lt;math&amp;gt;O(|V_T|)&amp;lt;/math&amp;gt; и сохранить в таблице, обращение к которой занимает &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; операций. Алгоритм пользуется структурами данных, описанными ниже.&lt;br /&gt;
&lt;br /&gt;
Вершины во вспомогательном дереве нумеруются битовыми словами следующим образом:&lt;br /&gt;
# Каждый лист помечается порядковым номером 0, 1, 2... в двоичном представлении в порядке встречи листов при [[Обход_в_глубину,_цвета_вершин|обходе в глубину]].&lt;br /&gt;
# Каждый не-лист помечается номером своего потомка, содержащим наибольшее количество ведущих нулей.&lt;br /&gt;
Рёбра в дереве получают тег, который формируется следующим образом. Рассмотрим ребро &amp;lt;math&amp;gt;e = \{u, v\}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится дальше от корня. Пусть &amp;lt;math&amp;gt;d(v)&amp;lt;/math&amp;gt; обозначает расстояние от вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; до корня, а &amp;lt;math&amp;gt;i(v)&amp;lt;/math&amp;gt; {{---}} номер младшей единицы в номере вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;. Тогда тег ребра &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; {{---}} строка размера &amp;lt;math&amp;gt;\lceil\lg\lg |V_T|\rceil&amp;lt;/math&amp;gt;, записанная как &amp;lt;math&amp;gt;&amp;lt;d(v), i(v)&amp;gt;&amp;lt;/math&amp;gt;. В оригинальной работе было показано, что имея тег ребра и номер вершины, можно обнаружить ребро в графе за константное время.&lt;br /&gt;
&lt;br /&gt;
Для каждой вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; создается вектор длины &amp;lt;math&amp;gt;\lceil\lg|V_T|\rceil&amp;lt;/math&amp;gt;, обозначаемый как &amp;lt;math&amp;gt;LCA(v)&amp;lt;/math&amp;gt;, чей бит с номером i равен 1, когда существует путь из листа в поддереве с корнем &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; в лист в другом поддереве, наивысшая по уровню вершина которого (иначе говоря, наименьший общий предок двух листьев) находится на расстоянии &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Далее, вершины делятся на два класса. Если &amp;lt;math&amp;gt;|A(v)|&amp;gt;\frac{\lceil\lg|V_T|\rceil}{\lceil\lg\lg |V_T|\rceil}&amp;lt;/math&amp;gt;, то вершина &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; считается ''большой''; в противном случае вершина считается ''малой''. Для больших вершин создаются списки &amp;lt;math&amp;gt;bigList&amp;lt;/math&amp;gt;, для малых {{---}} &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt;. &amp;lt;math&amp;gt;BigList&amp;lt;/math&amp;gt; содержит теги рёбер из &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt; в порядке неубывания длин путей из корня в листья, соответствующих рёбрам. Для хранения такого списка требуется &amp;lt;math&amp;gt;\frac{|A(v)|\lceil\lg\lg |V_T|\rceil}{\lceil\lg|V_T|\rceil}=O(\log\log |V_T|)&amp;lt;/math&amp;gt; памяти.&lt;br /&gt;
&lt;br /&gt;
Для малой вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; обозначим за &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; ближайшего большого предка. Список &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt; содержит либо теги рёбер из &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt;, либо, если ребро &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;A(v)&amp;lt;/math&amp;gt; содержится в интервале от корня до &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, указатель на &amp;lt;math&amp;gt;bigList&amp;lt;/math&amp;gt; вершины &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, содержащий тег для &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt;. Для каждой малой вершины запоминается номер первого элемента в &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt;, являющимся тегом. Элементы списка, идущие после первого тега, тоже являются тегами. Для хранения &amp;lt;math&amp;gt;smallList&amp;lt;/math&amp;gt; требуется одно битовое слово.&lt;br /&gt;
&lt;br /&gt;
Построение и использование структуры данных подробно описано в оригинальной статье. &lt;br /&gt;
&lt;br /&gt;
=== Анализ сложности ===&lt;br /&gt;
Было показано, что сложность построения данных для одной вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; возможно за &amp;lt;math&amp;gt;O\left(\log |A(v)|\right)&amp;lt;/math&amp;gt; операций. Суммируя по всем вершинам, итоговая сложность алгоритма &amp;lt;math&amp;gt;O\left(|V_T|\log\left(\frac{|E_T|+|V_T|}{|V_T|}\right)\right)&amp;lt;/math&amp;gt;, что и было показано Комлосом.&lt;br /&gt;
&lt;br /&gt;
Дополнительно алгоритм тратит &amp;lt;math&amp;gt;O(|V_T|+|E_T|)&amp;lt;/math&amp;gt; операций для построения списков &amp;lt;math&amp;gt;LCA(v)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций для обработки таблиц с предвычисленными значениями и &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; операций сравнения для нахождения ребра с максимальным весом из двух половин.&lt;br /&gt;
&lt;br /&gt;
В завершении алгоритма, требуется сравнить веса рёбер графа, которые не входят в остовное дерево, с найденными в дереве &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; рёбрами наибольшего веса, что потребует дополнительных &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; операций сравнения.&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* King, V. A simpler minimum spanning tree verification algorithm. Algorithmica 18, 263–270 (1997). https://doi.org/10.1007/BF02526037&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B8%D0%BD%D1%82%D0%B5%D0%B7_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=78950</id>
		<title>Синтез речи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B8%D0%BD%D1%82%D0%B5%D0%B7_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=78950"/>
				<updated>2021-01-19T18:31:22Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: Исправлены категории&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Категория:Машинное обучение]] [[Категория: Обработка естественного языка]]&lt;br /&gt;
'''Синтез речи''' (англ. speech synthesis) {{---}} процесс генерации компьютером человеческой речи. Компьютерная система, способная к синтезу речи, называется речевым синтезатором.&lt;br /&gt;
Система, генерирующая человеческую речь, основываясь на тексте, называется '''text-to-speech''' системой (сокр. TTS).&lt;br /&gt;
&lt;br /&gt;
В процессе человеческой речи нервная система транслирует некоторый текст или мысленный концепт в движение мышц, связанных с органами дыхания и речи. Затем производится генерация акустического сигнала с помощью потока воздуха из легких. Сигнал содержит как периодические компоненты (созданные с помощью вибрации органов речи), так и апериодические&lt;br /&gt;
(созданные окружающей средой и фоновым шумом). Используя изменяющиеся во времени сокращения мышц, меняются частотные характеристики акустического сигнала.&lt;br /&gt;
Задача систем генерации речи по тексту {{---}} симулировать данный процесс в каком-либо виде.&lt;br /&gt;
&lt;br /&gt;
== Этапы синтеза речи ==&lt;br /&gt;
Работу систем синтеза речи по тексту как правило можно разделить на два этапа, за которые отвечают два отдельных компонента {{---}} обработка текста и синтез речи.&lt;br /&gt;
&lt;br /&gt;
Первый этап обычно содержит несколько этапов [[Обработка естественного языка|обработки естественного языка]], такие как разбиение  на предложения, разбиение на слова, нормализация текста,&lt;br /&gt;
автоматическая морфологическая разметка и конвертация графем в фонемы (англ. grapheme-to-phoneme conversion, G2P).&lt;br /&gt;
Данный этап принимает в качестве входных параметров текст и возвращает последовательность фонем с различными выделенными лингвистическими особенностями.&lt;br /&gt;
&lt;br /&gt;
Этап синтеза речи, в свою очередь, принимает на вход последовательность фонем и возвращает синтезированную звуковую волну речи.&lt;br /&gt;
Данный этап обычно включает в себя алгоритмы предсказания [https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%81%D0%BE%D0%B4%D0%B8%D1%8F_(%D0%BB%D0%B8%D0%BD%D0%B3%D0%B2%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0)/ просодии] {{---}} характеристик речи, описывающих признаки, являющиеся дополнительными к основной артикуляции звука, такие как тон, ударение, громкость и т.д. &lt;br /&gt;
&lt;br /&gt;
== Генерация звуковой волны ==&lt;br /&gt;
&lt;br /&gt;
Обычно, синтезаторы речи не работают непосредственно с сигналом звуковой волны, а используют некоторое представление этого сигнала, например, спектрограмму. Алгоритм, способный выделить такие параметры и по ним обратно восстановить звуковую волну, называется '''вокодер''' (англ. voice encoder). Примерами таких алгоритмов являются мю-закон &amp;lt;ref name=&amp;quot;mu law&amp;quot;&amp;gt;[http://www.itu.int/rec/dologin_pub.asp?lang=e&amp;amp;id=T-REC-G.711-198811-I!!PDF-E&amp;amp;type=items/ &amp;quot;ITU-T Recommendation G.711&amp;quot;]&amp;lt;/ref&amp;gt; и восстановление сигнала по его спектрограмме. &lt;br /&gt;
&lt;br /&gt;
Мю-закон преобразует каждое значение дискретизированного сигнала &amp;lt;math&amp;gt;\textbf{x} = \{x_1, x_2, \dots, x_T\}&amp;lt;/math&amp;gt;  как&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(x_t) = sign(x_t) \frac{\ln(1+\mu|x_t|)}{\ln(1+\mu)}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\mu = 255&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1 &amp;lt; x_t &amp;lt; 1&amp;lt;/math&amp;gt;, а затем кодирует сигнал как двузначное шестнадцатеричное число, которое обозначает некоторый интервал на числовой прямой&amp;lt;ref name=&amp;quot;mu law&amp;quot;&amp;gt;[http://www.itu.int/rec/dologin_pub.asp?lang=e&amp;amp;id=T-REC-G.711-198811-I!!PDF-E&amp;amp;type=items/ &amp;quot;ITU-T Recommendation G.711&amp;quot;]&amp;lt;/ref&amp;gt;. Обратное преобразование выбирает значение преобразованного сигнала &amp;lt;math&amp;gt;y_t=f(x_t)&amp;lt;/math&amp;gt; из данного номера интервала и получает оценку исходного сигнала &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; f^{-1}(y_t) = sign(y_t)(1/\mu)((1+\mu)^{|y_t|}-1), -1 &amp;lt; y_t &amp;lt; 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В качестве представления звукового сигнала может выступать [https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0/ спектрограмма волны] {{---}} изображение, показывающее зависимость спектральной плотности мощности сигнала от времени. Спектрограммы отображают частоту и амплитуду сигнала во времени, но не содержат никакой информации о фазе сигнала, из-за чего результат обратного восстановления сигнала по спектрограмме неизбежно отличается от оригинала. Цифровая генерация спектрограммы сигнала &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; сводится к вычислению квадрата амплитуды [https://ru.wikipedia.org/wiki/%D0%9E%D0%BA%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5/ оконного преобразования Фурье]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;spectrogram(t, w) = |STFT(t, w)|^2&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; {{---}} используемое окно и &amp;lt;math&amp;gt;STFT(t, w)&amp;lt;/math&amp;gt; {{---}} оконное преобразование Фурье.&lt;br /&gt;
&lt;br /&gt;
Для восстановления исходного сигнала по его спектрограмме может быть использован алгоритм Гриффина-Лима&amp;lt;ref name=&amp;quot;griffin-lim&amp;quot;&amp;gt;D. Griffin and Jae Lim, &amp;quot;Signal estimation from modified short-time Fourier transform,&amp;quot; ICASSP '83. IEEE International Conference on Acoustics, Speech, and Signal Processing, Boston, Massachusetts, USA, 1983, pp. 804-807, doi: 10.1109/ICASSP.1983.1172092.&amp;lt;/ref&amp;gt;, который основан на минимизации среднеквадратичной ошибки между оконным преобразованием Фурье оцениваемого сигнала и имеющимся преобразованием в спектрограмме.&lt;br /&gt;
&lt;br /&gt;
== Классы подходов к синтезу речи ==&lt;br /&gt;
Основными требованиями к технологиям синтеза речи являются естественность (англ. naturalness) и разборчивость (англ. intelligibility).&lt;br /&gt;
Естественность описывает, насколько генерируемая речь близка к человеческой, а разборчивость отражает, насколько сложно понять речь.&lt;br /&gt;
Идеальный синтезатор речи генерирует одновременно и натуральную, и разборчивую речь.&lt;br /&gt;
=== Конкатенативный синтез ===&lt;br /&gt;
'''Конкатенативный синтез''' (англ. concatenative synthesis) основывается на конкатенации предварительно записанных примеров человеческой речи в единую звуковую последовательность. Данный подход синтезирует наиболее естественную речь, но генерируемая речь часто содержит значительные отличия и ошибки по сравнению с человеческой речью. Примеры конкатенативного синтеза:&lt;br /&gt;
&lt;br /&gt;
* '''Синтез с выбором''' (англ. unit selection synthesis) является самым используемым подходом конкатенативного синтеза и использует большую базу данных записанной речи. При создании базы данных записанные фразы могут делиться на различные звуковые единицы, такие, как фоны, дифоны, полуфоны, слоги, морфемы, целые фразы или предложения. При запуске алгоритм генерирует выходную звуковую волну с помощью выбора наилучшей последовательности звуковых единиц из базы данных. Данный выбор обычно реализован с помощью [[Дерево решений и случайный лес|дерева решений]]. Синтез с выбором обеспечивает наиболее естественную речь, так как использует минимальную цифровую обработку сигналов. Недостатком подхода является необходимость в довольно большой базе данных звуков для достижения наибольшей естественности речи. Данный подход являлся самым популярным для общего класса задач синтеза речи, но в последнее время уступает по популярности параметрическому подходу. Примером использования синтеза с выбором является голосовой помощник Siri от Apple &amp;lt;ref name=&amp;quot;apple&amp;quot;&amp;gt;[https://machinelearning.apple.com/research/siri-voices/ Deep Learning for Siri’s Voice: On-device Deep Mixture Density Networks for Hybrid Unit Selection Synthesis.]&amp;lt;/ref&amp;gt; и голосовой помощник Алиса от компании Яндекс &amp;lt;ref&amp;gt;[https://www.seonews.ru/analytics/optimization-2018-chto-nakhoditsya-pod-kapotom-u-alisy/ Optimization 2018: что находится «под капотом» у Алисы.]&amp;lt;/ref&amp;gt;. Несмотря на то, что эти продукты используют глубокое обучение, их механизм синтеза речи основан на записанных примерах голоса.&lt;br /&gt;
&lt;br /&gt;
* '''Дифонный синтез''' (англ. diphone synthesis) является частным случаем синтеза с выбором, который использует в качестве звуковых единиц дифоны (переход от звука к звуку). Подход использует только один образец каждого дифона. База данных дифонов при этом получается сравнительно небольшой. Например, немецкий язык содержит около 800 дифонов, а испанский {{---}} около 2500. При работе алгоритма просодия входной последовательности накладывается на дифоны в базе данных с помощью различных алгоритмов цифровой обработки сигналов. Данный алгоритм значительно уступает по качеству другим подходам и кроме меньшего размера базы данных не дает весомых преимуществ, из-за чего не снискал большой популярности.&lt;br /&gt;
&lt;br /&gt;
* '''Синтез речи, ограниченный предметной областью''' (англ. domain-specific speech synthesis) также является частным случаем синтеза с выбором и использует базу данных предварительно записанных слов, фраз и предложений для составления выходной последовательности. Он используется в задачах, где вариативность и размер используемых фраз ограничены некоторой предметной областью, например, прогнозирование погоды или составление расписания транспорта. Из-за значительной простоты реализации и использования данный подход уже долго применяется в коммерческих продуктах, например, говорящие часы или калькуляторы. При этом данный подход может обеспечивать высокую естественность речи вследствие ограниченности используемой базы данных. Недостатками таких систем является ограниченность областью применимости и неспособность учитывать контекст речи, что может вызывать ощутимые ошибки в некоторых языках.&lt;br /&gt;
&lt;br /&gt;
=== Параметрический синтез ===&lt;br /&gt;
Параметрический синтез (англ. statistical parametrical synthesis) для генерации выходной звуковой волны, в отличии от конкатенативного синтеза, не использует реальные примеры речи, а строит вероятностное распределение некоторых параметров и акустических свойств звуковой волны.&lt;br /&gt;
В начале работы параметрического синтезатора с помощью вокодера извлекаются параметры&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{o} = \{o_1, \dots, o_N\}&amp;lt;/math&amp;gt; звуковой волны и лингвистические данные &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; из текста, который необходимо озвучить. Конкретный вид вектора &amp;lt;math&amp;gt;\textbf{o}&amp;lt;/math&amp;gt; зависит от используемого вокодера {{---}} это может быть как спектрограмма волны, так и некоторое другое представление сигнала, например, дискретные номера интервалов числовой прямой, получаемые с помощью мю-закона. Затем, [[Порождающие модели|порождающая модель]], например, [[Марковская цепь|скрытая марковская цепь]],&lt;br /&gt;
[[Нейронные сети, перцептрон#Сети прямого распространения|нейронная сеть прямого распространения]] или [[Рекуррентные нейронные сети|рекуррентная нейронная сеть]], обучается по выделенным параметрам &amp;lt;math&amp;gt;\textbf{o}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;, получая параметры модели &amp;lt;math&amp;gt;\hat{\Lambda}&amp;lt;/math&amp;gt;, наиболее хорошо описывающие распределение &amp;lt;math&amp;gt;p(o|l, \Lambda)&amp;lt;/math&amp;gt;. На этапе синтеза, модель генерирует наиболее правдоподобные параметры звуковой волны, используя найденные на этапе обучения параметры модели &amp;lt;math&amp;gt;\hat{\Lambda}&amp;lt;/math&amp;gt; и лингвистическую информацию &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; текста, который необходимо озвучить:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{\textbf{o}} = \arg\max\limits_{\textbf{o}}p(\textbf{o} | l, \hat{\Lambda})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходная звуковая волна генерируется вокодером на основе найденных параметров &amp;lt;math&amp;gt;\hat{\textbf{o}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данный подход является самым популярным на сегодняшний момент, в том числе из-за того, что он позволяет использовать подходы, основанные на нейронных сетях. Современными продуктами, использующие основанный на глубоком обучении параметрический синтез являются Amazon Lex и Alexa &amp;lt;ref&amp;gt;[https://www.allthingsdistributed.com/2016/11/amazon-ai-and-alexa-for-all-aws-apps.html Bringing the Magic of Amazon AI and Alexa to Apps on AWS.] &amp;lt;/ref&amp;gt;, Google Ассистент &amp;lt;ref name=&amp;quot;cnet wavenet&amp;quot;&amp;gt;Martin, Taylor (May 9, 2018).[https://www.cnet.com/how-to/how-to-get-all-google-assistants-new-voices-right-now/  &amp;quot;Try the all-new Google Assistant voices right now&amp;quot;]. CNET.&amp;lt;/ref&amp;gt; и умные дисплеи Portal от Facebook &amp;lt;ref&amp;gt;[https://venturebeat.com/2020/05/15/facebooks-voice-synthesis-ai-generates-speech-in-500-milliseconds/ Facebook’s voice synthesis AI generates speech in 500 milliseconds.]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
== Алгоритмы, основанные на нейронных сетях ==&lt;br /&gt;
=== WaveNet ===&lt;br /&gt;
WaveNet&amp;lt;ref name=&amp;quot;wavenet&amp;quot;&amp;gt;Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&amp;lt;/ref&amp;gt; является [[Порождающие модели | порождающей моделью]], использующей параметрический подход к синтезу речи. Её задача {{---}} восстановить распределение вероятностей звукового сигнала&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{x} = \{x_1, x_2, \dots, x_T\}&amp;lt;/math&amp;gt; с помощью произведения условных вероятностей:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\textbf{x})=\prod\limits_{t=1}^{T} p(x_t | x_1, x_2, \dots, x_{t-1})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, вероятность каждого сигнала &amp;lt;math&amp;gt;x_t&amp;lt;/math&amp;gt; зависит только от предыдущих сигналов. Во время обучения модель оценивает данное условное распределение вероятностей, принимая на вход сигналы из обучающей выборки одновременно. На этапе генерации модель порождает выходные сигналы с помощью полученной оценки распределения вероятности последовательно {{---}} полученный моделью сигнал в момент времени &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; подается обратно на вход для генерации последующего сигнала в момент времени &amp;lt;math&amp;gt;t+1&amp;lt;/math&amp;gt;. Структура модели позволяет использовать её в широком спектре задач, например, в задачах продолжения музыкального произведения по его началу, порождения голоса конкретного человека или text-to-speech синтеза.&lt;br /&gt;
&lt;br /&gt;
Основной идеей модели является использование причинных сверточных сетей (англ. causal convolution layers) и [[Сверточные нейронные сети#Расширенная свертка (aнгл. Dilated convolution) | расширенных ]] причинных сверточных сетей (англ. dilated causal convolution layers).&lt;br /&gt;
Причинная сверточная сеть представляет собой несколько уровней сверточной нейронной сети, связанных между собой в порядке, который не нарушает последовательность&lt;br /&gt;
входного сигнала, т.е. оцениваемая в момент времени &amp;lt;math&amp;gt;t+1&amp;lt;/math&amp;gt; вероятность сигнала &amp;lt;math&amp;gt;p(x_{t+1} | x_1, x_2, \dots, x_t)&amp;lt;/math&amp;gt; не зависит от сигналов&lt;br /&gt;
в последующие моменты времени &amp;lt;math&amp;gt;t+2, t+3, \dots, T&amp;lt;/math&amp;gt;. Причинные сверточные сети обучаются&lt;br /&gt;
быстрее, чем [[Рекуррентные нейронные сети | рекуррентные нейронные сети]], но требуют достаточно большого количества уровней для обеспечивания большого окна восприятия сигнала (англ. signal reception window) {{---}} количество предыдущих сигналов, от которых зависит оценка сигнала в текущий момент.&lt;br /&gt;
&lt;br /&gt;
[[Файл:dilated-causal-convolutions.png|thumb|300px| Рисунок 1 —  строение причинной сверточной сети (сверху) и расширенной причинной сверточной сети (снизу)&amp;lt;ref name=&amp;quot;wavenet&amp;quot;&amp;gt;Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
Модификация причинных сверточных сетей, расширенные причинные сверточные сети, способна увеличить окно восприятия сигнала в разы и является основной идеей модели WaveNet.&lt;br /&gt;
Модификация заключается в применении свертки к области размерности большей, чем её длина, пропуская входные связи с некоторым шагом. Данный подход аналогичен применению пулинга или свертки с шагом большим единицы, но выходом расширенной причинной сверточной сети является последовательность размерности, равной размерности входной последовательности. Расширенные причинные сверточные сети способны достигать большего окна&lt;br /&gt;
восприятия сигнала, используя меньшее количество уровней, при этом сохраняя вычислительную сложность причинных сверточных сетей. Структура причинных сверточных сетей изображена на Рисунке 1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:wavenet.png|thumb|300px| Рисунок 2 —  строение модели WaveNet &amp;lt;ref name=&amp;quot;wavenet&amp;quot;&amp;gt;Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
Полная структура модели WaveNet изображена на Рисунке 2. В качестве вокодера используется [[Синтез речи#Генерация звуковой волны | мю-закон]].&lt;br /&gt;
Модель представляет собой множество слоев сверточной нейронной сети, аналогично модели [[PixelRNN_и_PixelCNN | PixelCNN]].&lt;br /&gt;
Модель на вход принимает закодированную мю-законом последовательность сигналов &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; и, опционально, некоторую дополнительную информацию, обозначаемую как вектор параметров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, а на выходе возвращает распределение вероятностей для параметров мю-закона, по которым можно восстановить синтезированный сигнал. На этапе обучения входным сигналом &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; является пример звука из обучающей выборки, который подается на все входы одновременно. На этапе генерации входом модели &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; будут являться сигналы, порожденные ею в предыдущие моменты времени и передаваемые ей последовательно. Дополнительная информация &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, например, может содержать информацию о рассматриваемом тексте в задаче text-to-speech синтеза. &lt;br /&gt;
&lt;br /&gt;
Модель представляет собой набор из &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; [[Сверточные нейронные сети#Residual block | блоков с остаточной связью]], содержащих преобразование расширенной причинной свертки и функцию активации. Функция активации при этом аналогична функции, предложенной в модели Gated PixelCNN &amp;lt;ref&amp;gt;Aaron van den Oord, Nal Kalchbrenner, Oriol Vinyals, Lasse Espeholt, Alex Graves, &amp;amp; Koray Kavukcuoglu. (2016). Conditional Image Generation with PixelCNN Decoders. [https://arxiv.org/abs/1606.05328/ arXiv:1606.05328]&lt;br /&gt;
&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{y} = \tanh(W_{f, k} * \textbf{x}) \odot \sigma(W_{g,k}*\textbf{x})&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; {{---}} номер слоя модели, &amp;lt;math&amp;gt;f, g&amp;lt;/math&amp;gt; {{---}} индексы входов преобразования, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; {{---}} функция сигмоиды, &amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt; {{---}} операция свертки, &amp;lt;math&amp;gt;\odot&amp;lt;/math&amp;gt; {{---}} операция покомпонентного умножения векторов и &amp;lt;math&amp;gt;W&amp;lt;/math&amp;gt; {{---}} выученные параметры свертки.&lt;br /&gt;
&lt;br /&gt;
В случае использования дополнительной информации &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; модель оценивает распределение вероятностей звукового сигнала как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\textbf{x}|\textbf{h})=\prod\limits_{t=1}^{T} p(x_t | x_1, x_2, \dots, x_{t-1}, \textbf{h})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для использования дополнительной информации &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt; функция активации может использовать вектор &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt; глобально при вычислении каждой свертки как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{y} = \tanh(W_{f, k} * \textbf{x} + V_{f,k}^T\textbf{h}) \odot \sigma(W_{g,k}*\textbf{x}+V_{g,k}^T\textbf{h})&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;V_{f,k}&amp;lt;/math&amp;gt; {{---}} выученные параметры линейной проекции. В случае, когда размерность вектора &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt; меньше, чем размерность &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt;, можно использовать upsampling-преобразование сверточных сетей, чтобы получить вектор размерности &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; и использовать его вместо оригинального вектора &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt;. При этом &amp;lt;math&amp;gt;V_{f,k}*\textbf{h}&amp;lt;/math&amp;gt; будет являться операцией свертки размера 1.&lt;br /&gt;
&lt;br /&gt;
Самый известный пример применения WaveNet для синтеза речи является  технология Google Ассистент, которая использует WaveNet для генерации голосов ассистентов на различных&lt;br /&gt;
языках. Модель позволила значительно сократить количество записей речи актеров озвучки, требуемых для создания голосовой модели&amp;lt;ref name=&amp;quot;cnet wavenet&amp;quot;&amp;gt;Martin, Taylor (May 9, 2018).[https://www.cnet.com/how-to/how-to-get-all-google-assistants-new-voices-right-now/  &amp;quot;Try the all-new Google Assistant voices right now&amp;quot;]. CNET.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
=== Tacotron ===&lt;br /&gt;
[[Файл:Tacotron.PNG|thumb|300px| Рисунок 3 — строение модели Tacotron&amp;lt;ref name=&amp;quot;tacotron&amp;quot;&amp;gt;Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
[[Файл:Tacotron-cbhg.PNG|thumb|300px| Рисунок 4 —строение модуля CBHG модели Tacotron&amp;lt;ref name=&amp;quot;tacotron&amp;quot;&amp;gt;Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
Tacotron {{---}} модель&amp;lt;ref name=&amp;quot;tacotron&amp;quot;&amp;gt;Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&amp;lt;/ref&amp;gt; параметрического синтеза речи, основанная на подходе [[Механизм внимания | seq2seq]], разработанная Google и опубликованная в 2017 году. Модель состоит из кодера, декодера с [[Механизм внимания | вниманием]] и нейронной сети для&lt;br /&gt;
пост-процессинга сигнала. Схема модели изображена на Рисунке 2.&lt;br /&gt;
&lt;br /&gt;
Кодер и сеть пост-процессинга опираются на блок CBHG, схема которого изображена на Рисунке 3. Блок состоит из набора одномерных сверточных фильтров, за которыми следуют&lt;br /&gt;
шоссейные нейронные сети (англ. highway networks)&amp;lt;ref&amp;gt;Rupesh Kumar Srivastava, Klaus Greff, and J ̈urgen Schmidhuber. Highway networks. [https://arxiv.org/abs/1505.00387/ arXiv:1505.00387], 2015.&amp;lt;/ref&amp;gt;, являющиеся модификацией [[Долгая краткосрочная память | LSTM сетей]], и двунаправленный [[Долгая краткосрочная память#Управляемые рекуррентные нейроны | управляемый рекуррентный блок]]. Входная последовательность сначала обрабатывается &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;&lt;br /&gt;
наборами сверточных фильтров с размерностью &amp;lt;math&amp;gt;1, 2, \dots, K&amp;lt;/math&amp;gt;. Эти фильтры моделируют локальную и контекстно-зависимую информацию (по аналогии с моделированием униграмм,&lt;br /&gt;
биграмм, вплоть до &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;-грамм). Выход сверточного уровня далее обрабатывается шоссейной сетью для дальнейшего выделения параметров. В конце CBHG&lt;br /&gt;
используется управляемый рекуррентный блок, который для выделения параметров опирается на контекст перед рассматриваемым символом и после рассматриваемого символа.&lt;br /&gt;
&lt;br /&gt;
Задача кодера заключается в извлечении последовательных параметров из текста. Его входом является последовательность символов, в которой каждый символ был закодирован one-hot&lt;br /&gt;
кодированием и объединен в единый непрерывный вектор. К данному входу применяется ряд нелинейных преобразований в виде сети с бутылочным горлышком (англ. bottleneck layer), что позволяет улучшить&lt;br /&gt;
обобщаемость сети и ускорить сходимость. Модуль CBHG преобразует выход нелинейных преобразований в итоговое представление текста, которая передается в декодер.&lt;br /&gt;
&lt;br /&gt;
Декодер является рекуррентной нейронной сетью с вниманием, в которой запрос внимания генерируется каждый временной промежуток. Вектор контекста соединяется с выходом ячейки внимания&lt;br /&gt;
и подается на вход декодирующим рекуррентным нейронным сетям, которые являются управляемыми рекуррентными блоками. Выходом декодера является спектрограмма звуковой волны, которая&lt;br /&gt;
передается сети пост-обработки для генерации непосредственно звуковой волны.&lt;br /&gt;
&lt;br /&gt;
В качестве сети пост-обработки используется модуль CBHG, описанный ранее. После этого спектрограмма звуковой волны передается на вход [[Синтез речи#Генерация звуковой волны | алгоритму Гриффина-Лима]], который генерирует итоговую звуковую волну.&lt;br /&gt;
&lt;br /&gt;
Модель Tacotron была значительно улучшена в последующей модификации Tacotron 2 &amp;lt;ref&amp;gt;Jonathan Shen, Ruoming Pang, Ron J. Weiss, Mike Schuster, Navdeep Jaitly, Zongheng Yang, Zhifeng Chen, Yu Zhang, Yuxuan Wang, RJ Skerry-Ryan, Rif A. Saurous, Yannis Agiomyrgiannakis, &amp;amp; Yonghui Wu. (2018). Natural TTS Synthesis by Conditioning WaveNet on Mel Spectrogram Predictions. [https://arxiv.org/abs/1712.05884  arXiv:1712.05884].&amp;lt;/ref&amp;gt;, которая переработала исходную архитектуру Tacotron и объединила её с вокодером на основе WaveNet. Данная модель способна синтезировать речь высокого качества, принимая на вход только текст, который необходимо озвучить&amp;lt;ref name=&amp;quot;tacotron2&amp;quot;&amp;gt;[https://ai.googleblog.com/2017/12/tacotron-2-generating-human-like-speech.html/ Tacotron 2: Generating Human-like Speech from Text]&amp;lt;/ref&amp;gt;. Реализация данной модели доступна на [https://github.com/NVIDIA/tacotron2 Github].&lt;br /&gt;
&lt;br /&gt;
== Проблемы ==&lt;br /&gt;
=== Задача обработки текста === &lt;br /&gt;
Алгоритмы обработки текста могут не справляться с обработкой определенных частей речи, таких, как аббревиатуры, числа и гетеронимы. Произношение определенных слов также зависит от контекста их применения. Большинство систем синтеза речи по тексту не способны выделять контекст предложений и используют различные эвристические подходы с целью различить омографы (слова с одинаковым написанием, но различным произношением).&lt;br /&gt;
=== Преобразование текста в фонемы ===&lt;br /&gt;
Процесс преобразования текста в фонемы обычно подразделяется на два подхода {{---}} словарный и основанный на правилах. Словарный подход использует словарь с записанными фонетическими представлениями слов и в процессе работы производит поиск в нем с целью конвертации слова в последовательность фонем. Основанный на правилах подход использует набор правил, которые применяются к словам или частям слов с целью выделения фонем. Оба эти подхода имеют существенные недостатки и требуют усовершенствования.&lt;br /&gt;
=== Оценка качества ===&lt;br /&gt;
На данный момент не существует единых критериев оценки качества синтезаторов речи. В каждом отдельном применении технологии синтеза речи могут быть в том числе свои критерии качества, связанные с предметной областью или используемым оборудованием. С другой стороны, ряд исследователей начали оценивать синтезаторы речи используя распространенные наборы данных для синтеза речи &amp;lt;ref&amp;gt;[http://festvox.org/blizzard/ Blizzard Challenge]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Популярной метрикой оценки естественности речи является '''средняя оценка мнения''' (англ. mean opinion score)&amp;lt;ref name=&amp;quot;mos&amp;quot;&amp;gt;[https://www.itu.int/rec/T-REC-P.800.2 ITU-T Recommendation P.800.2 : Mean opinion score interpretation and reporting]&amp;lt;/ref&amp;gt;. Она заключается в воспроизведении результатов работы синтезатора речи выборке людей, которые затем оценивают её качество по шкале от 1 до 5, в которой 1 означает &amp;quot;плохое&amp;quot; качество, 5 {{---}} &amp;quot;идеальное&amp;quot;. Итоговой оценкой является среднее арифметическое всех оценок. Данная метрика страдает от субъективности и предвзятости опрашиваемых людей, в частности, в подобного рода экспериментах опрашиваемые стремятся ставить оценки, располагающиеся на всей ширине интервала оценок&amp;lt;ref name=&amp;quot;bias&amp;quot;&amp;gt;Zielinski, Slawomir, Francis Rumsey, and Søren Bech. &amp;quot;On some biases encountered in modern audio quality listening tests-a review.&amp;quot; Journal of the Audio Engineering Society 56.6 (2008): 427-451.&amp;lt;/ref&amp;gt;. Из этого следует, что данная оценка не является абсолютной и её нельзя использовать для сравнения двух отдельных экспериментов кроме тех случаев, когда эксперимент поставлен особым образом, чтобы учесть данный недостаток, и даже в таком случае требуется статистический анализ данных, чтобы убедиться, что такое сравнение двух систем корректно&amp;lt;ref name=&amp;quot;mos&amp;quot;&amp;gt;[https://www.itu.int/rec/T-REC-P.800.2 ITU-T Recommendation P.800.2 : Mean opinion score interpretation and reporting]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Модели WaveNet, Tacotron и Tacotron 2 использовали среднюю оценку мнения для сравнения своей работы с естественным языком и другими подходами. Например, WaveNet достиг оценки 4.21 и 4.08 для американского варианта английского и путунхуа, по сравнению с оценками естественного языка 4.46 и 4.25 соответственно. Работа, описывающая модель Tacotron, сравнивала модель с другими разрабатываемыми подходами&amp;lt;ref&amp;gt;Heiga Zen, Yannis Agiomyrgiannakis, Niels Egberts, Fergus Henderson, and Przemysław Szczepa-niak. Fast, compact, and high quality LSTM-RNN based statistical parametric speech synthesizersfor mobile devices.Proceedings Interspeech, 2016&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Junyoung Chung, Caglar Gulcehre, KyungHyun Cho, and Yoshua Bengio.  Empirical evaluation ofgated recurrent neural networks on sequence modeling. [https://arxiv.org/abs/1412/3555 arXiv:1412.3555], 2014.&amp;lt;/ref&amp;gt;. Tacotron смог достичь оценки в 3.82 балла для американского варианта английского, когда параметрический подход достиг 3.69, а конкатенативный - 4.09. Tacotron 2 смог достичь оценки в 4.52 балла по сравнению с оценкой записанной речи в 4.58 балла&amp;lt;ref name=&amp;quot;tacotron2&amp;quot;&amp;gt;[https://ai.googleblog.com/2017/12/tacotron-2-generating-human-like-speech.html/ Tacotron 2: Generating Human-like Speech from Text]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
== См. также ==&lt;br /&gt;
&lt;br /&gt;
* [[Нейронные сети, перцептрон ]]&lt;br /&gt;
* [[Сверточные нейронные сети ]]&lt;br /&gt;
* [[ Рекуррентные нейронные сети ]]&lt;br /&gt;
* [[ Механизм внимания ]]&lt;br /&gt;
* [[ Распознавание речи ]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&lt;br /&gt;
* Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B8%D0%BD%D1%82%D0%B5%D0%B7_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=78811</id>
		<title>Синтез речи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B8%D0%BD%D1%82%D0%B5%D0%B7_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=78811"/>
				<updated>2021-01-18T17:20:10Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: Добавлена ссылка на реализацию Tacotron 2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}[[Категория:Машинное обучение]]&lt;br /&gt;
'''Синтез речи''' (англ. speech synthesis) {{---}} процесс генерации компьютером человеческой речи. Компьютерная система, способная к синтезу речи, называется речевым синтезатором.&lt;br /&gt;
Система, генерирующая человеческую речь, основываясь на тексте, называется '''text-to-speech''' системой (сокр. TTS).&lt;br /&gt;
&lt;br /&gt;
В процессе человеческой речи нервная система транслирует некоторый текст или мысленный концепт в движение мышц, связанных с органами дыхания и речи. Затем производится генерация акустического сигнала с помощью потока воздуха из легких. Сигнал содержит как периодические компоненты (созданные с помощью вибрации органов речи), так и апериодические&lt;br /&gt;
(созданные окружающей средой и фоновым шумом). Используя изменяющиеся во времени сокращения мышц, меняются частотные характеристики акустического сигнала.&lt;br /&gt;
Задача систем генерации речи по тексту {{---}} симулировать данный процесс в каком-либо виде.&lt;br /&gt;
&lt;br /&gt;
== Этапы синтеза речи ==&lt;br /&gt;
Работу систем синтеза речи по тексту как правило можно разделить на два этапа, за которые отвечают два отдельных компонента {{---}} обработка текста и синтез речи.&lt;br /&gt;
&lt;br /&gt;
Первый этап обычно содержит несколько этапов [[Обработка естественного языка|обработки естественного языка]], такие как разбиение  на предложения, разбиение на слова, нормализация текста,&lt;br /&gt;
автоматическая морфологическая разметка и конвертация графем в фонемы (англ. grapheme-to-phoneme conversion, G2P).&lt;br /&gt;
Данный этап принимает в качестве входных параметров текст и возвращает последовательность фонем с различными выделенными лингвистическими особенностями.&lt;br /&gt;
&lt;br /&gt;
Этап синтеза речи, в свою очередь, принимает на вход последовательность фонем и возвращает синтезированную звуковую волну речи.&lt;br /&gt;
Данный этап обычно включает в себя алгоритмы предсказания [https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%81%D0%BE%D0%B4%D0%B8%D1%8F_(%D0%BB%D0%B8%D0%BD%D0%B3%D0%B2%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0)/ просодии] {{---}} характеристик речи, описывающих признаки, являющиеся дополнительными к основной артикуляции звука, такие как тон, ударение, громкость и т.д. &lt;br /&gt;
&lt;br /&gt;
== Генерация звуковой волны ==&lt;br /&gt;
&lt;br /&gt;
Обычно, синтезаторы речи не работают непосредственно с сигналом звуковой волны, а используют некоторое представление этого сигнала, например, спектрограмму. Алгоритм, способный выделить такие параметры и по ним обратно восстановить звуковую волну, называется '''вокодер''' (англ. voice encoder). Примерами таких алгоритмов являются мю-закон &amp;lt;ref name=&amp;quot;mu law&amp;quot;&amp;gt;[http://www.itu.int/rec/dologin_pub.asp?lang=e&amp;amp;id=T-REC-G.711-198811-I!!PDF-E&amp;amp;type=items/ &amp;quot;ITU-T Recommendation G.711&amp;quot;]&amp;lt;/ref&amp;gt; и восстановление сигнала по его спектрограмме. &lt;br /&gt;
&lt;br /&gt;
Мю-закон преобразует каждое значение дискретизированного сигнала &amp;lt;math&amp;gt;\textbf{x} = \{x_1, x_2, \dots, x_T\}&amp;lt;/math&amp;gt;  как&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(x_t) = sign(x_t) \frac{\ln(1+\mu|x_t|)}{\ln(1+\mu)}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\mu = 255&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1 &amp;lt; x_t &amp;lt; 1&amp;lt;/math&amp;gt;, а затем кодирует сигнал как двузначное шестнадцатеричное число, которое обозначает некоторый интервал на числовой прямой&amp;lt;ref name=&amp;quot;mu law&amp;quot;&amp;gt;[http://www.itu.int/rec/dologin_pub.asp?lang=e&amp;amp;id=T-REC-G.711-198811-I!!PDF-E&amp;amp;type=items/ &amp;quot;ITU-T Recommendation G.711&amp;quot;]&amp;lt;/ref&amp;gt;. Обратное преобразование выбирает значение преобразованного сигнала &amp;lt;math&amp;gt;y_t=f(x_t)&amp;lt;/math&amp;gt; из данного номера интервала и получает оценку исходного сигнала &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; f^{-1}(y_t) = sign(y_t)(1/\mu)((1+\mu)^{|y_t|}-1), -1 &amp;lt; y_t &amp;lt; 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В качестве представления звукового сигнала может выступать [https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0/ спектрограмма волны] {{---}} изображение, показывающее зависимость спектральной плотности мощности сигнала от времени. Спектрограммы отображают частоту и амплитуду сигнала во времени, но не содержат никакой информации о фазе сигнала, из-за чего результат обратного восстановления сигнала по спектрограмме неизбежно отличается от оригинала. Цифровая генерация спектрограммы сигнала &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; сводится к вычислению квадрата амплитуды [https://ru.wikipedia.org/wiki/%D0%9E%D0%BA%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5/ оконного преобразования Фурье]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;spectrogram(t, w) = |STFT(t, w)|^2&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; {{---}} используемое окно и &amp;lt;math&amp;gt;STFT(t, w)&amp;lt;/math&amp;gt; {{---}} оконное преобразование Фурье.&lt;br /&gt;
&lt;br /&gt;
Для восстановления исходного сигнала по его спектрограмме может быть использован алгоритм Гриффина-Лима&amp;lt;ref name=&amp;quot;griffin-lim&amp;quot;&amp;gt;D. Griffin and Jae Lim, &amp;quot;Signal estimation from modified short-time Fourier transform,&amp;quot; ICASSP '83. IEEE International Conference on Acoustics, Speech, and Signal Processing, Boston, Massachusetts, USA, 1983, pp. 804-807, doi: 10.1109/ICASSP.1983.1172092.&amp;lt;/ref&amp;gt;, который основан на минимизации среднеквадратичной ошибки между оконным преобразованием Фурье оцениваемого сигнала и имеющимся преобразованием в спектрограмме.&lt;br /&gt;
&lt;br /&gt;
== Классы подходов к синтезу речи ==&lt;br /&gt;
Основными требованиями к технологиям синтеза речи являются естественность (англ. naturalness) и разборчивость (англ. intelligibility).&lt;br /&gt;
Естественность описывает, насколько генерируемая речь близка к человеческой, а разборчивость отражает, насколько сложно понять речь.&lt;br /&gt;
Идеальный синтезатор речи генерирует одновременно и натуральную, и разборчивую речь.&lt;br /&gt;
=== Конкатенативный синтез ===&lt;br /&gt;
'''Конкатенативный синтез''' (англ. concatenative synthesis) основывается на конкатенации предварительно записанных примеров человеческой речи в единую звуковую последовательность. Данный подход синтезирует наиболее естественную речь, но генерируемая речь часто содержит значительные отличия и ошибки по сравнению с человеческой речью. Примеры конкатенативного синтеза:&lt;br /&gt;
&lt;br /&gt;
* '''Синтез с выбором''' (англ. unit selection synthesis) является самым используемым подходом конкатенативного синтеза и использует большую базу данных записанной речи. При создании базы данных записанные фразы могут делиться на различные звуковые единицы, такие, как фоны, дифоны, полуфоны, слоги, морфемы, целые фразы или предложения. При запуске алгоритм генерирует выходную звуковую волну с помощью выбора наилучшей последовательности звуковых единиц из базы данных. Данный выбор обычно реализован с помощью [[Дерево решений и случайный лес|дерева решений]]. Синтез с выбором обеспечивает наиболее естественную речь, так как использует минимальную цифровую обработку сигналов. Недостатком подхода является необходимость в довольно большой базе данных звуков для достижения наибольшей естественности речи. Данный подход являлся самым популярным для общего класса задач синтеза речи, но в последнее время уступает по популярности параметрическому подходу. Примером использования синтеза с выбором является голосовой помощник Siri от Apple &amp;lt;ref name=&amp;quot;apple&amp;quot;&amp;gt;[https://machinelearning.apple.com/research/siri-voices/ Deep Learning for Siri’s Voice: On-device Deep Mixture Density Networks for Hybrid Unit Selection Synthesis.]&amp;lt;/ref&amp;gt; и голосовой помощник Алиса от компании Яндекс &amp;lt;ref&amp;gt;[https://www.seonews.ru/analytics/optimization-2018-chto-nakhoditsya-pod-kapotom-u-alisy/ Optimization 2018: что находится «под капотом» у Алисы.]&amp;lt;/ref&amp;gt;. Несмотря на то, что эти продукты используют глубокое обучение, их механизм синтеза речи основан на записанных примерах голоса.&lt;br /&gt;
&lt;br /&gt;
* '''Дифонный синтез''' (англ. diphone synthesis) является частным случаем синтеза с выбором, который использует в качестве звуковых единиц дифоны (переход от звука к звуку). Подход использует только один образец каждого дифона. База данных дифонов при этом получается сравнительно небольшой. Например, немецкий язык содержит около 800 дифонов, а испанский {{---}} около 2500. При работе алгоритма просодия входной последовательности накладывается на дифоны в базе данных с помощью различных алгоритмов цифровой обработки сигналов. Данный алгоритм значительно уступает по качеству другим подходам и кроме меньшего размера базы данных не дает весомых преимуществ, из-за чего не снискал большой популярности.&lt;br /&gt;
&lt;br /&gt;
* '''Синтез речи, ограниченный предметной областью''' (англ. domain-specific speech synthesis) также является частным случаем синтеза с выбором и использует базу данных предварительно записанных слов, фраз и предложений для составления выходной последовательности. Он используется в задачах, где вариативность и размер используемых фраз ограничены некоторой предметной областью, например, прогнозирование погоды или составление расписания транспорта. Из-за значительной простоты реализации и использования данный подход уже долго применяется в коммерческих продуктах, например, говорящие часы или калькуляторы. При этом данный подход может обеспечивать высокую естественность речи вследствие ограниченности используемой базы данных. Недостатками таких систем является ограниченность областью применимости и неспособность учитывать контекст речи, что может вызывать ощутимые ошибки в некоторых языках.&lt;br /&gt;
&lt;br /&gt;
=== Параметрический синтез ===&lt;br /&gt;
Параметрический синтез (англ. statistical parametrical synthesis) для генерации выходной звуковой волны, в отличии от конкатенативного синтеза, не использует реальные примеры речи, а строит вероятностное распределение некоторых параметров и акустических свойств звуковой волны.&lt;br /&gt;
В начале работы параметрического синтезатора с помощью вокодера извлекаются параметры&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{o} = \{o_1, \dots, o_N\}&amp;lt;/math&amp;gt; звуковой волны и лингвистические данные &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; из текста, который необходимо озвучить. Конкретный вид вектора &amp;lt;math&amp;gt;\textbf{o}&amp;lt;/math&amp;gt; зависит от используемого вокодера {{---}} это может быть как спектрограмма волны, так и некоторое другое представление сигнала, например, дискретные номера интервалов числовой прямой, получаемые с помощью мю-закона. Затем, [[Порождающие модели|порождающая модель]], например, [[Марковская цепь|скрытая марковская цепь]],&lt;br /&gt;
[[Нейронные сети, перцептрон#Сети прямого распространения|нейронная сеть прямого распространения]] или [[Рекуррентные нейронные сети|рекуррентная нейронная сеть]], обучается по выделенным параметрам &amp;lt;math&amp;gt;\textbf{o}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;, получая параметры модели &amp;lt;math&amp;gt;\hat{\Lambda}&amp;lt;/math&amp;gt;, наиболее хорошо описывающие распределение &amp;lt;math&amp;gt;p(o|l, \Lambda)&amp;lt;/math&amp;gt;. На этапе синтеза, модель генерирует наиболее правдоподобные параметры звуковой волны, используя найденные на этапе обучения параметры модели &amp;lt;math&amp;gt;\hat{\Lambda}&amp;lt;/math&amp;gt; и лингвистическую информацию &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; текста, который необходимо озвучить:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{\textbf{o}} = \arg\max\limits_{\textbf{o}}p(\textbf{o} | l, \hat{\Lambda})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходная звуковая волна генерируется вокодером на основе найденных параметров &amp;lt;math&amp;gt;\hat{\textbf{o}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данный подход является самым популярным на сегодняшний момент, в том числе из-за того, что он позволяет использовать подходы, основанные на нейронных сетях. Современными продуктами, использующие основанный на глубоком обучении параметрический синтез являются Amazon Lex и Alexa &amp;lt;ref&amp;gt;[https://www.allthingsdistributed.com/2016/11/amazon-ai-and-alexa-for-all-aws-apps.html Bringing the Magic of Amazon AI and Alexa to Apps on AWS.] &amp;lt;/ref&amp;gt;, Google Ассистент &amp;lt;ref name=&amp;quot;cnet wavenet&amp;quot;&amp;gt;Martin, Taylor (May 9, 2018).[https://www.cnet.com/how-to/how-to-get-all-google-assistants-new-voices-right-now/  &amp;quot;Try the all-new Google Assistant voices right now&amp;quot;]. CNET.&amp;lt;/ref&amp;gt; и умные дисплеи Portal от Facebook &amp;lt;ref&amp;gt;[https://venturebeat.com/2020/05/15/facebooks-voice-synthesis-ai-generates-speech-in-500-milliseconds/ Facebook’s voice synthesis AI generates speech in 500 milliseconds.]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
== Алгоритмы, основанные на нейронных сетях ==&lt;br /&gt;
=== WaveNet ===&lt;br /&gt;
WaveNet&amp;lt;ref name=&amp;quot;wavenet&amp;quot;&amp;gt;Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&amp;lt;/ref&amp;gt; является [[Порождающие модели | порождающей моделью]], использующей параметрический подход к синтезу речи. Её задача {{---}} восстановить распределение вероятностей звукового сигнала&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{x} = \{x_1, x_2, \dots, x_T\}&amp;lt;/math&amp;gt; с помощью произведения условных вероятностей:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\textbf{x})=\prod\limits_{t=1}^{T} p(x_t | x_1, x_2, \dots, x_{t-1})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, вероятность каждого сигнала &amp;lt;math&amp;gt;x_t&amp;lt;/math&amp;gt; зависит только от предыдущих сигналов. Во время обучения модель оценивает данное условное распределение вероятностей, принимая на вход сигналы из обучающей выборки одновременно. На этапе генерации модель порождает выходные сигналы с помощью полученной оценки распределения вероятности последовательно {{---}} полученный моделью сигнал в момент времени &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; подается обратно на вход для генерации последующего сигнала в момент времени &amp;lt;math&amp;gt;t+1&amp;lt;/math&amp;gt;. Структура модели позволяет использовать её в широком спектре задач, например, в задачах продолжения музыкального произведения по его началу, порождения голоса конкретного человека или text-to-speech синтеза.&lt;br /&gt;
&lt;br /&gt;
Основной идеей модели является использование причинных сверточных сетей (англ. causal convolution layers) и [[Сверточные нейронные сети#Расширенная свертка (aнгл. Dilated convolution) | расширенных ]] причинных сверточных сетей (англ. dilated causal convolution layers).&lt;br /&gt;
Причинная сверточная сеть представляет собой несколько уровней сверточной нейронной сети, связанных между собой в порядке, который не нарушает последовательность&lt;br /&gt;
входного сигнала, т.е. оцениваемая в момент времени &amp;lt;math&amp;gt;t+1&amp;lt;/math&amp;gt; вероятность сигнала &amp;lt;math&amp;gt;p(x_{t+1} | x_1, x_2, \dots, x_t)&amp;lt;/math&amp;gt; не зависит от сигналов&lt;br /&gt;
в последующие моменты времени &amp;lt;math&amp;gt;t+2, t+3, \dots, T&amp;lt;/math&amp;gt;. Причинные сверточные сети обучаются&lt;br /&gt;
быстрее, чем [[Рекуррентные нейронные сети | рекуррентные нейронные сети]], но требуют достаточно большого количества уровней для обеспечивания большого окна восприятия сигнала (англ. signal reception window) {{---}} количество предыдущих сигналов, от которых зависит оценка сигнала в текущий момент.&lt;br /&gt;
&lt;br /&gt;
[[Файл:dilated-causal-convolutions.png|thumb|300px| Рисунок 1 —  строение причинной сверточной сети (сверху) и расширенной причинной сверточной сети (снизу)&amp;lt;ref name=&amp;quot;wavenet&amp;quot;&amp;gt;Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
Модификация причинных сверточных сетей, расширенные причинные сверточные сети, способна увеличить окно восприятия сигнала в разы и является основной идеей модели WaveNet.&lt;br /&gt;
Модификация заключается в применении свертки к области размерности большей, чем её длина, пропуская входные связи с некоторым шагом. Данный подход аналогичен применению пулинга или свертки с шагом большим единицы, но выходом расширенной причинной сверточной сети является последовательность размерности, равной размерности входной последовательности. Расширенные причинные сверточные сети способны достигать большего окна&lt;br /&gt;
восприятия сигнала, используя меньшее количество уровней, при этом сохраняя вычислительную сложность причинных сверточных сетей. Структура причинных сверточных сетей изображена на Рисунке 1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:wavenet.png|thumb|300px| Рисунок 2 —  строение модели WaveNet &amp;lt;ref name=&amp;quot;wavenet&amp;quot;&amp;gt;Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
Полная структура модели WaveNet изображена на Рисунке 2. В качестве вокодера используется [[Синтез речи#Генерация звуковой волны | мю-закон]].&lt;br /&gt;
Модель представляет собой множество слоев сверточной нейронной сети, аналогично модели [[PixelRNN_и_PixelCNN | PixelCNN]].&lt;br /&gt;
Модель на вход принимает закодированную мю-законом последовательность сигналов &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; и, опционально, некоторую дополнительную информацию, обозначаемую как вектор параметров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, а на выходе возвращает распределение вероятностей для параметров мю-закона, по которым можно восстановить синтезированный сигнал. На этапе обучения входным сигналом &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; является пример звука из обучающей выборки, который подается на все входы одновременно. На этапе генерации входом модели &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; будут являться сигналы, порожденные ею в предыдущие моменты времени и передаваемые ей последовательно. Дополнительная информация &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, например, может содержать информацию о рассматриваемом тексте в задаче text-to-speech синтеза. &lt;br /&gt;
&lt;br /&gt;
Модель представляет собой набор из &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; [[Сверточные нейронные сети#Residual block | блоков с остаточной связью]], содержащих преобразование расширенной причинной свертки и функцию активации. Функция активации при этом аналогична функции, предложенной в модели Gated PixelCNN &amp;lt;ref&amp;gt;Aaron van den Oord, Nal Kalchbrenner, Oriol Vinyals, Lasse Espeholt, Alex Graves, &amp;amp; Koray Kavukcuoglu. (2016). Conditional Image Generation with PixelCNN Decoders. [https://arxiv.org/abs/1606.05328/ arXiv:1606.05328]&lt;br /&gt;
&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{y} = \tanh(W_{f, k} * \textbf{x}) \odot \sigma(W_{g,k}*\textbf{x})&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; {{---}} номер слоя модели, &amp;lt;math&amp;gt;f, g&amp;lt;/math&amp;gt; {{---}} индексы входов преобразования, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; {{---}} функция сигмоиды, &amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt; {{---}} операция свертки, &amp;lt;math&amp;gt;\odot&amp;lt;/math&amp;gt; {{---}} операция покомпонентного умножения векторов и &amp;lt;math&amp;gt;W&amp;lt;/math&amp;gt; {{---}} выученные параметры свертки.&lt;br /&gt;
&lt;br /&gt;
В случае использования дополнительной информации &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; модель оценивает распределение вероятностей звукового сигнала как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\textbf{x}|\textbf{h})=\prod\limits_{t=1}^{T} p(x_t | x_1, x_2, \dots, x_{t-1}, \textbf{h})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для использования дополнительной информации &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt; функция активации может использовать вектор &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt; глобально при вычислении каждой свертки как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{y} = \tanh(W_{f, k} * \textbf{x} + V_{f,k}^T\textbf{h}) \odot \sigma(W_{g,k}*\textbf{x}+V_{g,k}^T\textbf{h})&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;V_{f,k}&amp;lt;/math&amp;gt; {{---}} выученные параметры линейной проекции. В случае, когда размерность вектора &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt; меньше, чем размерность &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt;, можно использовать upsampling-преобразование сверточных сетей, чтобы получить вектор размерности &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; и использовать его вместо оригинального вектора &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt;. При этом &amp;lt;math&amp;gt;V_{f,k}*\textbf{h}&amp;lt;/math&amp;gt; будет являться операцией свертки размера 1.&lt;br /&gt;
&lt;br /&gt;
Самый известный пример применения WaveNet для синтеза речи является  технология Google Ассистент, которая использует WaveNet для генерации голосов ассистентов на различных&lt;br /&gt;
языках. Модель позволила значительно сократить количество записей речи актеров озвучки, требуемых для создания голосовой модели&amp;lt;ref name=&amp;quot;cnet wavenet&amp;quot;&amp;gt;Martin, Taylor (May 9, 2018).[https://www.cnet.com/how-to/how-to-get-all-google-assistants-new-voices-right-now/  &amp;quot;Try the all-new Google Assistant voices right now&amp;quot;]. CNET.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
=== Tacotron ===&lt;br /&gt;
[[Файл:Tacotron.PNG|thumb|300px| Рисунок 3 — строение модели Tacotron&amp;lt;ref name=&amp;quot;tacotron&amp;quot;&amp;gt;Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
[[Файл:Tacotron-cbhg.PNG|thumb|300px| Рисунок 4 —строение модуля CBHG модели Tacotron&amp;lt;ref name=&amp;quot;tacotron&amp;quot;&amp;gt;Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
Tacotron {{---}} модель&amp;lt;ref name=&amp;quot;tacotron&amp;quot;&amp;gt;Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&amp;lt;/ref&amp;gt; параметрического синтеза речи, основанная на подходе [[Механизм внимания | seq2seq]], разработанная Google и опубликованная в 2017 году. Модель состоит из кодера, декодера с [[Механизм внимания | вниманием]] и нейронной сети для&lt;br /&gt;
пост-процессинга сигнала. Схема модели изображена на Рисунке 2.&lt;br /&gt;
&lt;br /&gt;
Кодер и сеть пост-процессинга опираются на блок CBHG, схема которого изображена на Рисунке 3. Блок состоит из набора одномерных сверточных фильтров, за которыми следуют&lt;br /&gt;
шоссейные нейронные сети (англ. highway networks)&amp;lt;ref&amp;gt;Rupesh Kumar Srivastava, Klaus Greff, and J ̈urgen Schmidhuber. Highway networks. [https://arxiv.org/abs/1505.00387/ arXiv:1505.00387], 2015.&amp;lt;/ref&amp;gt;, являющиеся модификацией [[Долгая краткосрочная память | LSTM сетей]], и двунаправленный [[Долгая краткосрочная память#Управляемые рекуррентные нейроны | управляемый рекуррентный блок]]. Входная последовательность сначала обрабатывается &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;&lt;br /&gt;
наборами сверточных фильтров с размерностью &amp;lt;math&amp;gt;1, 2, \dots, K&amp;lt;/math&amp;gt;. Эти фильтры моделируют локальную и контекстно-зависимую информацию (по аналогии с моделированием униграмм,&lt;br /&gt;
биграмм, вплоть до &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;-грамм). Выход сверточного уровня далее обрабатывается шоссейной сетью для дальнейшего выделения параметров. В конце CBHG&lt;br /&gt;
используется управляемый рекуррентный блок, который для выделения параметров опирается на контекст перед рассматриваемым символом и после рассматриваемого символа.&lt;br /&gt;
&lt;br /&gt;
Задача кодера заключается в извлечении последовательных параметров из текста. Его входом является последовательность символов, в которой каждый символ был закодирован one-hot&lt;br /&gt;
кодированием и объединен в единый непрерывный вектор. К данному входу применяется ряд нелинейных преобразований в виде сети с бутылочным горлышком (англ. bottleneck layer), что позволяет улучшить&lt;br /&gt;
обобщаемость сети и ускорить сходимость. Модуль CBHG преобразует выход нелинейных преобразований в итоговое представление текста, которая передается в декодер.&lt;br /&gt;
&lt;br /&gt;
Декодер является рекуррентной нейронной сетью с вниманием, в которой запрос внимания генерируется каждый временной промежуток. Вектор контекста соединяется с выходом ячейки внимания&lt;br /&gt;
и подается на вход декодирующим рекуррентным нейронным сетям, которые являются управляемыми рекуррентными блоками. Выходом декодера является спектрограмма звуковой волны, которая&lt;br /&gt;
передается сети пост-обработки для генерации непосредственно звуковой волны.&lt;br /&gt;
&lt;br /&gt;
В качестве сети пост-обработки используется модуль CBHG, описанный ранее. После этого спектрограмма звуковой волны передается на вход [[Синтез речи#Генерация звуковой волны | алгоритму Гриффина-Лима]], который генерирует итоговую звуковую волну.&lt;br /&gt;
&lt;br /&gt;
Модель Tacotron была значительно улучшена в последующей модификации Tacotron 2 &amp;lt;ref&amp;gt;Jonathan Shen, Ruoming Pang, Ron J. Weiss, Mike Schuster, Navdeep Jaitly, Zongheng Yang, Zhifeng Chen, Yu Zhang, Yuxuan Wang, RJ Skerry-Ryan, Rif A. Saurous, Yannis Agiomyrgiannakis, &amp;amp; Yonghui Wu. (2018). Natural TTS Synthesis by Conditioning WaveNet on Mel Spectrogram Predictions. [https://arxiv.org/abs/1712.05884  arXiv:1712.05884].&amp;lt;/ref&amp;gt;, которая переработала исходную архитектуру Tacotron и объединила её с вокодером на основе WaveNet. Данная модель способна синтезировать речь высокого качества, принимая на вход только текст, который необходимо озвучить&amp;lt;ref name=&amp;quot;tacotron2&amp;quot;&amp;gt;[https://ai.googleblog.com/2017/12/tacotron-2-generating-human-like-speech.html/ Tacotron 2: Generating Human-like Speech from Text]&amp;lt;/ref&amp;gt;. Реализация данной модели доступна на [https://github.com/NVIDIA/tacotron2 Github].&lt;br /&gt;
&lt;br /&gt;
== Проблемы ==&lt;br /&gt;
=== Задача обработки текста === &lt;br /&gt;
Алгоритмы обработки текста могут не справляться с обработкой определенных частей речи, таких, как аббревиатуры, числа и гетеронимы. Произношение определенных слов также зависит от контекста их применения. Большинство систем синтеза речи по тексту не способны выделять контекст предложений и используют различные эвристические подходы с целью различить омографы (слова с одинаковым написанием, но различным произношением).&lt;br /&gt;
=== Преобразование текста в фонемы ===&lt;br /&gt;
Процесс преобразования текста в фонемы обычно подразделяется на два подхода {{---}} словарный и основанный на правилах. Словарный подход использует словарь с записанными фонетическими представлениями слов и в процессе работы производит поиск в нем с целью конвертации слова в последовательность фонем. Основанный на правилах подход использует набор правил, которые применяются к словам или частям слов с целью выделения фонем. Оба эти подхода имеют существенные недостатки и требуют усовершенствования.&lt;br /&gt;
=== Оценка качества ===&lt;br /&gt;
На данный момент не существует единых критериев оценки качества синтезаторов речи. В каждом отдельном применении технологии синтеза речи могут быть в том числе свои критерии качества, связанные с предметной областью или используемым оборудованием. С другой стороны, ряд исследователей начали оценивать синтезаторы речи используя распространенные наборы данных для синтеза речи &amp;lt;ref&amp;gt;[http://festvox.org/blizzard/ Blizzard Challenge]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Популярной метрикой оценки естественности речи является '''средняя оценка мнения''' (англ. mean opinion score)&amp;lt;ref name=&amp;quot;mos&amp;quot;&amp;gt;[https://www.itu.int/rec/T-REC-P.800.2 ITU-T Recommendation P.800.2 : Mean opinion score interpretation and reporting]&amp;lt;/ref&amp;gt;. Она заключается в воспроизведении результатов работы синтезатора речи выборке людей, которые затем оценивают её качество по шкале от 1 до 5, в которой 1 означает &amp;quot;плохое&amp;quot; качество, 5 {{---}} &amp;quot;идеальное&amp;quot;. Итоговой оценкой является среднее арифметическое всех оценок. Данная метрика страдает от субъективности и предвзятости опрашиваемых людей, в частности, в подобного рода экспериментах опрашиваемые стремятся ставить оценки, располагающиеся на всей ширине интервала оценок&amp;lt;ref name=&amp;quot;bias&amp;quot;&amp;gt;Zielinski, Slawomir, Francis Rumsey, and Søren Bech. &amp;quot;On some biases encountered in modern audio quality listening tests-a review.&amp;quot; Journal of the Audio Engineering Society 56.6 (2008): 427-451.&amp;lt;/ref&amp;gt;. Из этого следует, что данная оценка не является абсолютной и её нельзя использовать для сравнения двух отдельных экспериментов кроме тех случаев, когда эксперимент поставлен особым образом, чтобы учесть данный недостаток, и даже в таком случае требуется статистический анализ данных, чтобы убедиться, что такое сравнение двух систем корректно&amp;lt;ref name=&amp;quot;mos&amp;quot;&amp;gt;[https://www.itu.int/rec/T-REC-P.800.2 ITU-T Recommendation P.800.2 : Mean opinion score interpretation and reporting]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Модели WaveNet, Tacotron и Tacotron 2 использовали среднюю оценку мнения для сравнения своей работы с естественным языком и другими подходами. Например, WaveNet достиг оценки 4.21 и 4.08 для американского варианта английского и путунхуа, по сравнению с оценками естественного языка 4.46 и 4.25 соответственно. Работа, описывающая модель Tacotron, сравнивала модель с другими разрабатываемыми подходами&amp;lt;ref&amp;gt;Heiga Zen, Yannis Agiomyrgiannakis, Niels Egberts, Fergus Henderson, and Przemysław Szczepa-niak. Fast, compact, and high quality LSTM-RNN based statistical parametric speech synthesizersfor mobile devices.Proceedings Interspeech, 2016&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Junyoung Chung, Caglar Gulcehre, KyungHyun Cho, and Yoshua Bengio.  Empirical evaluation ofgated recurrent neural networks on sequence modeling. [https://arxiv.org/abs/1412/3555 arXiv:1412.3555], 2014.&amp;lt;/ref&amp;gt;. Tacotron смог достичь оценки в 3.82 балла для американского варианта английского, когда параметрический подход достиг 3.69, а конкатенативный - 4.09. Tacotron 2 смог достичь оценки в 4.52 балла по сравнению с оценкой записанной речи в 4.58 балла&amp;lt;ref name=&amp;quot;tacotron2&amp;quot;&amp;gt;[https://ai.googleblog.com/2017/12/tacotron-2-generating-human-like-speech.html/ Tacotron 2: Generating Human-like Speech from Text]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
== См. также ==&lt;br /&gt;
&lt;br /&gt;
* [[Нейронные сети, перцептрон ]]&lt;br /&gt;
* [[Сверточные нейронные сети ]]&lt;br /&gt;
* [[ Рекуррентные нейронные сети ]]&lt;br /&gt;
* [[ Механизм внимания ]]&lt;br /&gt;
* [[ Распознавание речи ]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&lt;br /&gt;
* Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B8%D0%BD%D1%82%D0%B5%D0%B7_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=78809</id>
		<title>Синтез речи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B8%D0%BD%D1%82%D0%B5%D0%B7_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=78809"/>
				<updated>2021-01-18T17:09:24Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}[[Категория:Машинное обучение]]&lt;br /&gt;
'''Синтез речи''' (англ. speech synthesis) {{---}} процесс генерации компьютером человеческой речи. Компьютерная система, способная к синтезу речи, называется речевым синтезатором.&lt;br /&gt;
Система, генерирующая человеческую речь, основываясь на тексте, называется '''text-to-speech''' системой (сокр. TTS).&lt;br /&gt;
&lt;br /&gt;
В процессе человеческой речи нервная система транслирует некоторый текст или мысленный концепт в движение мышц, связанных с органами дыхания и речи. Затем производится генерация акустического сигнала с помощью потока воздуха из легких. Сигнал содержит как периодические компоненты (созданные с помощью вибрации органов речи), так и апериодические&lt;br /&gt;
(созданные окружающей средой и фоновым шумом). Используя изменяющиеся во времени сокращения мышц, меняются частотные характеристики акустического сигнала.&lt;br /&gt;
Задача систем генерации речи по тексту {{---}} симулировать данный процесс в каком-либо виде.&lt;br /&gt;
&lt;br /&gt;
== Этапы синтеза речи ==&lt;br /&gt;
Работу систем синтеза речи по тексту как правило можно разделить на два этапа, за которые отвечают два отдельных компонента {{---}} обработка текста и синтез речи.&lt;br /&gt;
&lt;br /&gt;
Первый этап обычно содержит несколько этапов [[Обработка естественного языка|обработки естественного языка]], такие как разбиение  на предложения, разбиение на слова, нормализация текста,&lt;br /&gt;
автоматическая морфологическая разметка и конвертация графем в фонемы (англ. grapheme-to-phoneme conversion, G2P).&lt;br /&gt;
Данный этап принимает в качестве входных параметров текст и возвращает последовательность фонем с различными выделенными лингвистическими особенностями.&lt;br /&gt;
&lt;br /&gt;
Этап синтеза речи, в свою очередь, принимает на вход последовательность фонем и возвращает синтезированную звуковую волну речи.&lt;br /&gt;
Данный этап обычно включает в себя алгоритмы предсказания [https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%81%D0%BE%D0%B4%D0%B8%D1%8F_(%D0%BB%D0%B8%D0%BD%D0%B3%D0%B2%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0)/ просодии] {{---}} характеристик речи, описывающих признаки, являющиеся дополнительными к основной артикуляции звука, такие как тон, ударение, громкость и т.д. &lt;br /&gt;
&lt;br /&gt;
== Генерация звуковой волны ==&lt;br /&gt;
&lt;br /&gt;
Обычно, синтезаторы речи не работают непосредственно с сигналом звуковой волны, а используют некоторое представление этого сигнала, например, спектрограмму. Алгоритм, способный выделить такие параметры и по ним обратно восстановить звуковую волну, называется '''вокодер''' (англ. voice encoder). Примерами таких алгоритмов являются мю-закон &amp;lt;ref name=&amp;quot;mu law&amp;quot;&amp;gt;[http://www.itu.int/rec/dologin_pub.asp?lang=e&amp;amp;id=T-REC-G.711-198811-I!!PDF-E&amp;amp;type=items/ &amp;quot;ITU-T Recommendation G.711&amp;quot;]&amp;lt;/ref&amp;gt; и восстановление сигнала по его спектрограмме. &lt;br /&gt;
&lt;br /&gt;
Мю-закон преобразует каждое значение дискретизированного сигнала &amp;lt;math&amp;gt;\textbf{x} = \{x_1, x_2, \dots, x_T\}&amp;lt;/math&amp;gt;  как&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(x_t) = sign(x_t) \frac{\ln(1+\mu|x_t|)}{\ln(1+\mu)}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\mu = 255&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1 &amp;lt; x_t &amp;lt; 1&amp;lt;/math&amp;gt;, а затем кодирует сигнал как двузначное шестнадцатеричное число, которое обозначает некоторый интервал на числовой прямой&amp;lt;ref name=&amp;quot;mu law&amp;quot;&amp;gt;[http://www.itu.int/rec/dologin_pub.asp?lang=e&amp;amp;id=T-REC-G.711-198811-I!!PDF-E&amp;amp;type=items/ &amp;quot;ITU-T Recommendation G.711&amp;quot;]&amp;lt;/ref&amp;gt;. Обратное преобразование выбирает значение преобразованного сигнала &amp;lt;math&amp;gt;y_t=f(x_t)&amp;lt;/math&amp;gt; из данного номера интервала и получает оценку исходного сигнала &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; f^{-1}(y_t) = sign(y_t)(1/\mu)((1+\mu)^{|y_t|}-1), -1 &amp;lt; y_t &amp;lt; 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В качестве представления звукового сигнала может выступать [https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0/ спектрограмма волны] {{---}} изображение, показывающее зависимость спектральной плотности мощности сигнала от времени. Спектрограммы отображают частоту и амплитуду сигнала во времени, но не содержат никакой информации о фазе сигнала, из-за чего результат обратного восстановления сигнала по спектрограмме неизбежно отличается от оригинала. Цифровая генерация спектрограммы сигнала &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; сводится к вычислению квадрата амплитуды [https://ru.wikipedia.org/wiki/%D0%9E%D0%BA%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5/ оконного преобразования Фурье]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;spectrogram(t, w) = |STFT(t, w)|^2&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; {{---}} используемое окно и &amp;lt;math&amp;gt;STFT(t, w)&amp;lt;/math&amp;gt; {{---}} оконное преобразование Фурье.&lt;br /&gt;
&lt;br /&gt;
Для восстановления исходного сигнала по его спектрограмме может быть использован алгоритм Гриффина-Лима&amp;lt;ref name=&amp;quot;griffin-lim&amp;quot;&amp;gt;D. Griffin and Jae Lim, &amp;quot;Signal estimation from modified short-time Fourier transform,&amp;quot; ICASSP '83. IEEE International Conference on Acoustics, Speech, and Signal Processing, Boston, Massachusetts, USA, 1983, pp. 804-807, doi: 10.1109/ICASSP.1983.1172092.&amp;lt;/ref&amp;gt;, который основан на минимизации среднеквадратичной ошибки между оконным преобразованием Фурье оцениваемого сигнала и имеющимся преобразованием в спектрограмме.&lt;br /&gt;
&lt;br /&gt;
== Классы подходов к синтезу речи ==&lt;br /&gt;
Основными требованиями к технологиям синтеза речи являются естественность (англ. naturalness) и разборчивость (англ. intelligibility).&lt;br /&gt;
Естественность описывает, насколько генерируемая речь близка к человеческой, а разборчивость отражает, насколько сложно понять речь.&lt;br /&gt;
Идеальный синтезатор речи генерирует одновременно и натуральную, и разборчивую речь.&lt;br /&gt;
=== Конкатенативный синтез ===&lt;br /&gt;
'''Конкатенативный синтез''' (англ. concatenative synthesis) основывается на конкатенации предварительно записанных примеров человеческой речи в единую звуковую последовательность. Данный подход синтезирует наиболее естественную речь, но генерируемая речь часто содержит значительные отличия и ошибки по сравнению с человеческой речью. Примеры конкатенативного синтеза:&lt;br /&gt;
&lt;br /&gt;
* '''Синтез с выбором''' (англ. unit selection synthesis) является самым используемым подходом конкатенативного синтеза и использует большую базу данных записанной речи. При создании базы данных записанные фразы могут делиться на различные звуковые единицы, такие, как фоны, дифоны, полуфоны, слоги, морфемы, целые фразы или предложения. При запуске алгоритм генерирует выходную звуковую волну с помощью выбора наилучшей последовательности звуковых единиц из базы данных. Данный выбор обычно реализован с помощью [[Дерево решений и случайный лес|дерева решений]]. Синтез с выбором обеспечивает наиболее естественную речь, так как использует минимальную цифровую обработку сигналов. Недостатком подхода является необходимость в довольно большой базе данных звуков для достижения наибольшей естественности речи. Данный подход являлся самым популярным для общего класса задач синтеза речи, но в последнее время уступает по популярности параметрическому подходу. Примером использования синтеза с выбором является голосовой помощник Siri от Apple &amp;lt;ref name=&amp;quot;apple&amp;quot;&amp;gt;[https://machinelearning.apple.com/research/siri-voices/ Deep Learning for Siri’s Voice: On-device Deep Mixture Density Networks for Hybrid Unit Selection Synthesis.]&amp;lt;/ref&amp;gt; и голосовой помощник Алиса от компании Яндекс &amp;lt;ref&amp;gt;[https://www.seonews.ru/analytics/optimization-2018-chto-nakhoditsya-pod-kapotom-u-alisy/ Optimization 2018: что находится «под капотом» у Алисы.]&amp;lt;/ref&amp;gt;. Несмотря на то, что эти продукты используют глубокое обучение, их механизм синтеза речи основан на записанных примерах голоса.&lt;br /&gt;
&lt;br /&gt;
* '''Дифонный синтез''' (англ. diphone synthesis) является частным случаем синтеза с выбором, который использует в качестве звуковых единиц дифоны (переход от звука к звуку). Подход использует только один образец каждого дифона. База данных дифонов при этом получается сравнительно небольшой. Например, немецкий язык содержит около 800 дифонов, а испанский {{---}} около 2500. При работе алгоритма просодия входной последовательности накладывается на дифоны в базе данных с помощью различных алгоритмов цифровой обработки сигналов. Данный алгоритм значительно уступает по качеству другим подходам и кроме меньшего размера базы данных не дает весомых преимуществ, из-за чего не снискал большой популярности.&lt;br /&gt;
&lt;br /&gt;
* '''Синтез речи, ограниченный предметной областью''' (англ. domain-specific speech synthesis) также является частным случаем синтеза с выбором и использует базу данных предварительно записанных слов, фраз и предложений для составления выходной последовательности. Он используется в задачах, где вариативность и размер используемых фраз ограничены некоторой предметной областью, например, прогнозирование погоды или составление расписания транспорта. Из-за значительной простоты реализации и использования данный подход уже долго применяется в коммерческих продуктах, например, говорящие часы или калькуляторы. При этом данный подход может обеспечивать высокую естественность речи вследствие ограниченности используемой базы данных. Недостатками таких систем является ограниченность областью применимости и неспособность учитывать контекст речи, что может вызывать ощутимые ошибки в некоторых языках.&lt;br /&gt;
&lt;br /&gt;
=== Параметрический синтез ===&lt;br /&gt;
Параметрический синтез (англ. statistical parametrical synthesis) для генерации выходной звуковой волны, в отличии от конкатенативного синтеза, не использует реальные примеры речи, а строит вероятностное распределение некоторых параметров и акустических свойств звуковой волны.&lt;br /&gt;
В начале работы параметрического синтезатора с помощью вокодера извлекаются параметры&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{o} = \{o_1, \dots, o_N\}&amp;lt;/math&amp;gt; звуковой волны и лингвистические данные &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; из текста, который необходимо озвучить. Конкретный вид вектора &amp;lt;math&amp;gt;\textbf{o}&amp;lt;/math&amp;gt; зависит от используемого вокодера {{---}} это может быть как спектрограмма волны, так и некоторое другое представление сигнала, например, дискретные номера интервалов числовой прямой, получаемые с помощью мю-закона. Затем, [[Порождающие модели|порождающая модель]], например, [[Марковская цепь|скрытая марковская цепь]],&lt;br /&gt;
[[Нейронные сети, перцептрон#Сети прямого распространения|нейронная сеть прямого распространения]] или [[Рекуррентные нейронные сети|рекуррентная нейронная сеть]], обучается по выделенным параметрам &amp;lt;math&amp;gt;\textbf{o}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;, получая параметры модели &amp;lt;math&amp;gt;\hat{\Lambda}&amp;lt;/math&amp;gt;, наиболее хорошо описывающие распределение &amp;lt;math&amp;gt;p(o|l, \Lambda)&amp;lt;/math&amp;gt;. На этапе синтеза, модель генерирует наиболее правдоподобные параметры звуковой волны, используя найденные на этапе обучения параметры модели &amp;lt;math&amp;gt;\hat{\Lambda}&amp;lt;/math&amp;gt; и лингвистическую информацию &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; текста, который необходимо озвучить:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{\textbf{o}} = \arg\max\limits_{\textbf{o}}p(\textbf{o} | l, \hat{\Lambda})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходная звуковая волна генерируется вокодером на основе найденных параметров &amp;lt;math&amp;gt;\hat{\textbf{o}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данный подход является самым популярным на сегодняшний момент, в том числе из-за того, что он позволяет использовать подходы, основанные на нейронных сетях. Современными продуктами, использующие основанный на глубоком обучении параметрический синтез являются Amazon Lex и Alexa &amp;lt;ref&amp;gt;[https://www.allthingsdistributed.com/2016/11/amazon-ai-and-alexa-for-all-aws-apps.html Bringing the Magic of Amazon AI and Alexa to Apps on AWS.] &amp;lt;/ref&amp;gt;, Google Ассистент &amp;lt;ref name=&amp;quot;cnet wavenet&amp;quot;&amp;gt;Martin, Taylor (May 9, 2018).[https://www.cnet.com/how-to/how-to-get-all-google-assistants-new-voices-right-now/  &amp;quot;Try the all-new Google Assistant voices right now&amp;quot;]. CNET.&amp;lt;/ref&amp;gt; и умные дисплеи Portal от Facebook &amp;lt;ref&amp;gt;[https://venturebeat.com/2020/05/15/facebooks-voice-synthesis-ai-generates-speech-in-500-milliseconds/ Facebook’s voice synthesis AI generates speech in 500 milliseconds.]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
== Алгоритмы, основанные на нейронных сетях ==&lt;br /&gt;
=== WaveNet ===&lt;br /&gt;
WaveNet&amp;lt;ref name=&amp;quot;wavenet&amp;quot;&amp;gt;Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&amp;lt;/ref&amp;gt; является [[Порождающие модели | порождающей моделью]], использующей параметрический подход к синтезу речи. Её задача {{---}} восстановить распределение вероятностей звукового сигнала&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{x} = \{x_1, x_2, \dots, x_T\}&amp;lt;/math&amp;gt; с помощью произведения условных вероятностей:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\textbf{x})=\prod\limits_{t=1}^{T} p(x_t | x_1, x_2, \dots, x_{t-1})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, вероятность каждого сигнала &amp;lt;math&amp;gt;x_t&amp;lt;/math&amp;gt; зависит только от предыдущих сигналов. Во время обучения модель оценивает данное условное распределение вероятностей, принимая на вход сигналы из обучающей выборки одновременно. На этапе генерации модель порождает выходные сигналы с помощью полученной оценки распределения вероятности последовательно {{---}} полученный моделью сигнал в момент времени &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; подается обратно на вход для генерации последующего сигнала в момент времени &amp;lt;math&amp;gt;t+1&amp;lt;/math&amp;gt;. Структура модели позволяет использовать её в широком спектре задач, например, в задачах продолжения музыкального произведения по его началу, порождения голоса конкретного человека или text-to-speech синтеза.&lt;br /&gt;
&lt;br /&gt;
Основной идеей модели является использование причинных сверточных сетей (англ. causal convolution layers) и [[Сверточные нейронные сети#Расширенная свертка (aнгл. Dilated convolution) | расширенных ]] причинных сверточных сетей (англ. dilated causal convolution layers).&lt;br /&gt;
Причинная сверточная сеть представляет собой несколько уровней сверточной нейронной сети, связанных между собой в порядке, который не нарушает последовательность&lt;br /&gt;
входного сигнала, т.е. оцениваемая в момент времени &amp;lt;math&amp;gt;t+1&amp;lt;/math&amp;gt; вероятность сигнала &amp;lt;math&amp;gt;p(x_{t+1} | x_1, x_2, \dots, x_t)&amp;lt;/math&amp;gt; не зависит от сигналов&lt;br /&gt;
в последующие моменты времени &amp;lt;math&amp;gt;t+2, t+3, \dots, T&amp;lt;/math&amp;gt;. Причинные сверточные сети обучаются&lt;br /&gt;
быстрее, чем [[Рекуррентные нейронные сети | рекуррентные нейронные сети]], но требуют достаточно большого количества уровней для обеспечивания большого окна восприятия сигнала (англ. signal reception window) {{---}} количество предыдущих сигналов, от которых зависит оценка сигнала в текущий момент.&lt;br /&gt;
&lt;br /&gt;
[[Файл:dilated-causal-convolutions.png|thumb|300px| Рисунок 1 —  строение причинной сверточной сети (сверху) и расширенной причинной сверточной сети (снизу)&amp;lt;ref name=&amp;quot;wavenet&amp;quot;&amp;gt;Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
Модификация причинных сверточных сетей, расширенные причинные сверточные сети, способна увеличить окно восприятия сигнала в разы и является основной идеей модели WaveNet.&lt;br /&gt;
Модификация заключается в применении свертки к области размерности большей, чем её длина, пропуская входные связи с некоторым шагом. Данный подход аналогичен применению пулинга или свертки с шагом большим единицы, но выходом расширенной причинной сверточной сети является последовательность размерности, равной размерности входной последовательности. Расширенные причинные сверточные сети способны достигать большего окна&lt;br /&gt;
восприятия сигнала, используя меньшее количество уровней, при этом сохраняя вычислительную сложность причинных сверточных сетей. Структура причинных сверточных сетей изображена на Рисунке 1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:wavenet.png|thumb|300px| Рисунок 2 —  строение модели WaveNet &amp;lt;ref name=&amp;quot;wavenet&amp;quot;&amp;gt;Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
Полная структура модели WaveNet изображена на Рисунке 2. В качестве вокодера используется [[Синтез речи#Генерация звуковой волны | мю-закон]].&lt;br /&gt;
Модель представляет собой множество слоев сверточной нейронной сети, аналогично модели [[PixelRNN_и_PixelCNN | PixelCNN]].&lt;br /&gt;
Модель на вход принимает закодированную мю-законом последовательность сигналов &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; и, опционально, некоторую дополнительную информацию, обозначаемую как вектор параметров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, а на выходе возвращает распределение вероятностей для параметров мю-закона, по которым можно восстановить синтезированный сигнал. На этапе обучения входным сигналом &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; является пример звука из обучающей выборки, который подается на все входы одновременно. На этапе генерации входом модели &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; будут являться сигналы, порожденные ею в предыдущие моменты времени и передаваемые ей последовательно. Дополнительная информация &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, например, может содержать информацию о рассматриваемом тексте в задаче text-to-speech синтеза. &lt;br /&gt;
&lt;br /&gt;
Модель представляет собой набор из &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; [[Сверточные нейронные сети#Residual block | блоков с остаточной связью]], содержащих преобразование расширенной причинной свертки и функцию активации. Функция активации при этом аналогична функции, предложенной в модели Gated PixelCNN &amp;lt;ref&amp;gt;Aaron van den Oord, Nal Kalchbrenner, Oriol Vinyals, Lasse Espeholt, Alex Graves, &amp;amp; Koray Kavukcuoglu. (2016). Conditional Image Generation with PixelCNN Decoders. [https://arxiv.org/abs/1606.05328/ arXiv:1606.05328]&lt;br /&gt;
&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{y} = \tanh(W_{f, k} * \textbf{x}) \odot \sigma(W_{g,k}*\textbf{x})&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; {{---}} номер слоя модели, &amp;lt;math&amp;gt;f, g&amp;lt;/math&amp;gt; {{---}} индексы входов преобразования, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; {{---}} функция сигмоиды, &amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt; {{---}} операция свертки, &amp;lt;math&amp;gt;\odot&amp;lt;/math&amp;gt; {{---}} операция покомпонентного умножения векторов и &amp;lt;math&amp;gt;W&amp;lt;/math&amp;gt; {{---}} выученные параметры свертки.&lt;br /&gt;
&lt;br /&gt;
В случае использования дополнительной информации &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; модель оценивает распределение вероятностей звукового сигнала как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\textbf{x}|\textbf{h})=\prod\limits_{t=1}^{T} p(x_t | x_1, x_2, \dots, x_{t-1}, \textbf{h})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для использования дополнительной информации &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt; функция активации может использовать вектор &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt; глобально при вычислении каждой свертки как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{y} = \tanh(W_{f, k} * \textbf{x} + V_{f,k}^T\textbf{h}) \odot \sigma(W_{g,k}*\textbf{x}+V_{g,k}^T\textbf{h})&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;V_{f,k}&amp;lt;/math&amp;gt; {{---}} выученные параметры линейной проекции. В случае, когда размерность вектора &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt; меньше, чем размерность &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt;, можно использовать upsampling-преобразование сверточных сетей, чтобы получить вектор размерности &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; и использовать его вместо оригинального вектора &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt;. При этом &amp;lt;math&amp;gt;V_{f,k}*\textbf{h}&amp;lt;/math&amp;gt; будет являться операцией свертки размера 1.&lt;br /&gt;
&lt;br /&gt;
Самый известный пример применения WaveNet для синтеза речи является  технология Google Ассистент, которая использует WaveNet для генерации голосов ассистентов на различных&lt;br /&gt;
языках. Модель позволила значительно сократить количество записей речи актеров озвучки, требуемых для создания голосовой модели&amp;lt;ref name=&amp;quot;cnet wavenet&amp;quot;&amp;gt;Martin, Taylor (May 9, 2018).[https://www.cnet.com/how-to/how-to-get-all-google-assistants-new-voices-right-now/  &amp;quot;Try the all-new Google Assistant voices right now&amp;quot;]. CNET.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
=== Tacotron ===&lt;br /&gt;
[[Файл:Tacotron.PNG|thumb|300px| Рисунок 3 — строение модели Tacotron&amp;lt;ref name=&amp;quot;tacotron&amp;quot;&amp;gt;Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
[[Файл:Tacotron-cbhg.PNG|thumb|300px| Рисунок 4 —строение модуля CBHG модели Tacotron&amp;lt;ref name=&amp;quot;tacotron&amp;quot;&amp;gt;Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
Tacotron {{---}} модель&amp;lt;ref name=&amp;quot;tacotron&amp;quot;&amp;gt;Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&amp;lt;/ref&amp;gt; параметрического синтеза речи, основанная на подходе [[Механизм внимания | seq2seq]], разработанная Google и опубликованная в 2017 году. Модель состоит из кодера, декодера с [[Механизм внимания | вниманием]] и нейронной сети для&lt;br /&gt;
пост-процессинга сигнала. Схема модели изображена на Рисунке 2.&lt;br /&gt;
&lt;br /&gt;
Кодер и сеть пост-процессинга опираются на блок CBHG, схема которого изображена на Рисунке 3. Блок состоит из набора одномерных сверточных фильтров, за которыми следуют&lt;br /&gt;
шоссейные нейронные сети (англ. highway networks)&amp;lt;ref&amp;gt;Rupesh Kumar Srivastava, Klaus Greff, and J ̈urgen Schmidhuber. Highway networks. [https://arxiv.org/abs/1505.00387/ arXiv:1505.00387], 2015.&amp;lt;/ref&amp;gt;, являющиеся модификацией [[Долгая краткосрочная память | LSTM сетей]], и двунаправленный [[Долгая краткосрочная память#Управляемые рекуррентные нейроны | управляемый рекуррентный блок]]. Входная последовательность сначала обрабатывается &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;&lt;br /&gt;
наборами сверточных фильтров с размерностью &amp;lt;math&amp;gt;1, 2, \dots, K&amp;lt;/math&amp;gt;. Эти фильтры моделируют локальную и контекстно-зависимую информацию (по аналогии с моделированием униграмм,&lt;br /&gt;
биграмм, вплоть до &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;-грамм). Выход сверточного уровня далее обрабатывается шоссейной сетью для дальнейшего выделения параметров. В конце CBHG&lt;br /&gt;
используется управляемый рекуррентный блок, который для выделения параметров опирается на контекст перед рассматриваемым символом и после рассматриваемого символа.&lt;br /&gt;
&lt;br /&gt;
Задача кодера заключается в извлечении последовательных параметров из текста. Его входом является последовательность символов, в которой каждый символ был закодирован one-hot&lt;br /&gt;
кодированием и объединен в единый непрерывный вектор. К данному входу применяется ряд нелинейных преобразований в виде сети с бутылочным горлышком (англ. bottleneck layer), что позволяет улучшить&lt;br /&gt;
обобщаемость сети и ускорить сходимость. Модуль CBHG преобразует выход нелинейных преобразований в итоговое представление текста, которая передается в декодер.&lt;br /&gt;
&lt;br /&gt;
Декодер является рекуррентной нейронной сетью с вниманием, в которой запрос внимания генерируется каждый временной промежуток. Вектор контекста соединяется с выходом ячейки внимания&lt;br /&gt;
и подается на вход декодирующим рекуррентным нейронным сетям, которые являются управляемыми рекуррентными блоками. Выходом декодера является спектрограмма звуковой волны, которая&lt;br /&gt;
передается сети пост-обработки для генерации непосредственно звуковой волны.&lt;br /&gt;
&lt;br /&gt;
В качестве сети пост-обработки используется модуль CBHG, описанный ранее. После этого спектрограмма звуковой волны передается на вход [[Синтез речи#Генерация звуковой волны | алгоритму Гриффина-Лима]], который генерирует итоговую звуковую волну.&lt;br /&gt;
&lt;br /&gt;
Модель Tacotron была значительно улучшена в последующей модификации Tacotron 2 &amp;lt;ref&amp;gt;Jonathan Shen, Ruoming Pang, Ron J. Weiss, Mike Schuster, Navdeep Jaitly, Zongheng Yang, Zhifeng Chen, Yu Zhang, Yuxuan Wang, RJ Skerry-Ryan, Rif A. Saurous, Yannis Agiomyrgiannakis, &amp;amp; Yonghui Wu. (2018). Natural TTS Synthesis by Conditioning WaveNet on Mel Spectrogram Predictions. [https://arxiv.org/abs/1712.05884  arXiv:1712.05884].&amp;lt;/ref&amp;gt;, которая переработала исходную архитектуру Tacotron и объединила её с вокодером на основе WaveNet. Данная модель способна синтезировать речь высокого качества, принимая на вход только текст, который необходимо озвучить&amp;lt;ref name=&amp;quot;tacotron2&amp;quot;&amp;gt;[https://ai.googleblog.com/2017/12/tacotron-2-generating-human-like-speech.html/ Tacotron 2: Generating Human-like Speech from Text]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Проблемы ==&lt;br /&gt;
=== Задача обработки текста === &lt;br /&gt;
Алгоритмы обработки текста могут не справляться с обработкой определенных частей речи, таких, как аббревиатуры, числа и гетеронимы. Произношение определенных слов также зависит от контекста их применения. Большинство систем синтеза речи по тексту не способны выделять контекст предложений и используют различные эвристические подходы с целью различить омографы (слова с одинаковым написанием, но различным произношением).&lt;br /&gt;
=== Преобразование текста в фонемы ===&lt;br /&gt;
Процесс преобразования текста в фонемы обычно подразделяется на два подхода {{---}} словарный и основанный на правилах. Словарный подход использует словарь с записанными фонетическими представлениями слов и в процессе работы производит поиск в нем с целью конвертации слова в последовательность фонем. Основанный на правилах подход использует набор правил, которые применяются к словам или частям слов с целью выделения фонем. Оба эти подхода имеют существенные недостатки и требуют усовершенствования.&lt;br /&gt;
=== Оценка качества ===&lt;br /&gt;
На данный момент не существует единых критериев оценки качества синтезаторов речи. В каждом отдельном применении технологии синтеза речи могут быть в том числе свои критерии качества, связанные с предметной областью или используемым оборудованием. С другой стороны, ряд исследователей начали оценивать синтезаторы речи используя распространенные наборы данных для синтеза речи &amp;lt;ref&amp;gt;[http://festvox.org/blizzard/ Blizzard Challenge]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Популярной метрикой оценки естественности речи является '''средняя оценка мнения''' (англ. mean opinion score)&amp;lt;ref name=&amp;quot;mos&amp;quot;&amp;gt;[https://www.itu.int/rec/T-REC-P.800.2 ITU-T Recommendation P.800.2 : Mean opinion score interpretation and reporting]&amp;lt;/ref&amp;gt;. Она заключается в воспроизведении результатов работы синтезатора речи выборке людей, которые затем оценивают её качество по шкале от 1 до 5, в которой 1 означает &amp;quot;плохое&amp;quot; качество, 5 {{---}} &amp;quot;идеальное&amp;quot;. Итоговой оценкой является среднее арифметическое всех оценок. Данная метрика страдает от субъективности и предвзятости опрашиваемых людей, в частности, в подобного рода экспериментах опрашиваемые стремятся ставить оценки, располагающиеся на всей ширине интервала оценок&amp;lt;ref name=&amp;quot;bias&amp;quot;&amp;gt;Zielinski, Slawomir, Francis Rumsey, and Søren Bech. &amp;quot;On some biases encountered in modern audio quality listening tests-a review.&amp;quot; Journal of the Audio Engineering Society 56.6 (2008): 427-451.&amp;lt;/ref&amp;gt;. Из этого следует, что данная оценка не является абсолютной и её нельзя использовать для сравнения двух отдельных экспериментов кроме тех случаев, когда эксперимент поставлен особым образом, чтобы учесть данный недостаток, и даже в таком случае требуется статистический анализ данных, чтобы убедиться, что такое сравнение двух систем корректно&amp;lt;ref name=&amp;quot;mos&amp;quot;&amp;gt;[https://www.itu.int/rec/T-REC-P.800.2 ITU-T Recommendation P.800.2 : Mean opinion score interpretation and reporting]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Модели WaveNet, Tacotron и Tacotron 2 использовали среднюю оценку мнения для сравнения своей работы с естественным языком и другими подходами. Например, WaveNet достиг оценки 4.21 и 4.08 для американского варианта английского и путунхуа, по сравнению с оценками естественного языка 4.46 и 4.25 соответственно. Работа, описывающая модель Tacotron, сравнивала модель с другими разрабатываемыми подходами&amp;lt;ref&amp;gt;Heiga Zen, Yannis Agiomyrgiannakis, Niels Egberts, Fergus Henderson, and Przemysław Szczepa-niak. Fast, compact, and high quality LSTM-RNN based statistical parametric speech synthesizersfor mobile devices.Proceedings Interspeech, 2016&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Junyoung Chung, Caglar Gulcehre, KyungHyun Cho, and Yoshua Bengio.  Empirical evaluation ofgated recurrent neural networks on sequence modeling. [https://arxiv.org/abs/1412/3555 arXiv:1412.3555], 2014.&amp;lt;/ref&amp;gt;. Tacotron смог достичь оценки в 3.82 балла для американского варианта английского, когда параметрический подход достиг 3.69, а конкатенативный - 4.09. Tacotron 2 смог достичь оценки в 4.52 балла по сравнению с оценкой записанной речи в 4.58 балла&amp;lt;ref name=&amp;quot;tacotron2&amp;quot;&amp;gt;[https://ai.googleblog.com/2017/12/tacotron-2-generating-human-like-speech.html/ Tacotron 2: Generating Human-like Speech from Text]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
== См. также ==&lt;br /&gt;
&lt;br /&gt;
* [[Нейронные сети, перцептрон ]]&lt;br /&gt;
* [[Сверточные нейронные сети ]]&lt;br /&gt;
* [[ Рекуррентные нейронные сети ]]&lt;br /&gt;
* [[ Механизм внимания ]]&lt;br /&gt;
* [[ Распознавание речи ]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&lt;br /&gt;
* Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B8%D0%BD%D1%82%D0%B5%D0%B7_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=78806</id>
		<title>Синтез речи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B8%D0%BD%D1%82%D0%B5%D0%B7_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=78806"/>
				<updated>2021-01-18T16:42:44Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}[[Категория:Машинное обучение]]&lt;br /&gt;
'''Синтез речи''' (англ. speech synthesis) {{---}} процесс генерации компьютером человеческой речи. Компьютерная система, способная к синтезу речи, называется речевым синтезатором.&lt;br /&gt;
Система, генерирующая человеческую речь, основываясь на тексте, называется '''text-to-speech''' системой (сокр. TTS).&lt;br /&gt;
&lt;br /&gt;
В процессе человеческой речи нервная система транслирует некоторый текст или мысленный концепт в движение мышц, связанных с органами дыхания и речи. Затем производится генерация акустического сигнала с помощью потока воздуха из легких. Сигнал содержит как периодические компоненты (созданные с помощью вибрации органов речи), так и апериодические&lt;br /&gt;
(созданные окружающей средой и фоновым шумом). Используя изменяющиеся во времени сокращения мышц, меняются частотные характеристики акустического сигнала.&lt;br /&gt;
Задача систем генерации речи по тексту {{---}} симулировать данный процесс в каком-либо виде.&lt;br /&gt;
&lt;br /&gt;
== Этапы синтеза речи ==&lt;br /&gt;
Работу систем синтеза речи по тексту как правило можно разделить на два этапа, за которые отвечают два отдельных компонента {{---}} обработка текста и синтез речи.&lt;br /&gt;
&lt;br /&gt;
Первый этап обычно содержит несколько этапов [[Обработка естественного языка|обработки естественного языка]], такие как разбиение  на предложения, разбиение на слова, нормализация текста,&lt;br /&gt;
автоматическая морфологическая разметка и конвертация графем в фонемы (англ. grapheme-to-phoneme conversion, G2P).&lt;br /&gt;
Данный этап принимает в качестве входных параметров текст и возвращает последовательность фонем с различными выделенными лингвистическими особенностями.&lt;br /&gt;
&lt;br /&gt;
Этап синтеза речи, в свою очередь, принимает на вход последовательность фонем и возвращает синтезированную звуковую волну речи.&lt;br /&gt;
Данный этап обычно включает в себя алгоритмы предсказания [https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%81%D0%BE%D0%B4%D0%B8%D1%8F_(%D0%BB%D0%B8%D0%BD%D0%B3%D0%B2%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0)/ просодии] {{---}} характеристик речи, описывающих признаки, являющиеся дополнительными к основной артикуляции звука, такие как тон, ударение, громкость и т.д. &lt;br /&gt;
&lt;br /&gt;
== Генерация звуковой волны ==&lt;br /&gt;
&lt;br /&gt;
Обычно, синтезаторы речи не работают непосредственно с сигналом звуковой волны, а используют некоторое представление этого сигнала, например, спектрограмму. Алгоритм, способный выделить такие параметры и по ним обратно восстановить звуковую волну, называется '''вокодер''' (англ. voice encoder). Примерами таких алгоритмов являются мю-закон &amp;lt;ref name=&amp;quot;mu law&amp;quot;&amp;gt;[http://www.itu.int/rec/dologin_pub.asp?lang=e&amp;amp;id=T-REC-G.711-198811-I!!PDF-E&amp;amp;type=items/ &amp;quot;ITU-T Recommendation G.711&amp;quot;]&amp;lt;/ref&amp;gt; и восстановление сигнала по его спектрограмме. &lt;br /&gt;
&lt;br /&gt;
Мю-закон преобразует каждое значение дискретизированного сигнала &amp;lt;math&amp;gt;\textbf{x} = \{x_1, x_2, \dots, x_T\}&amp;lt;/math&amp;gt;  как&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(x_t) = sign(x_t) \frac{\ln(1+\mu|x_t|)}{\ln(1+\mu)}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\mu = 255&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1 &amp;lt; x_t &amp;lt; 1&amp;lt;/math&amp;gt;, а затем кодирует сигнал как двузначное шестнадцатеричное число, которое обозначает некоторый интервал на числовой прямой&amp;lt;ref name=&amp;quot;mu law&amp;quot;&amp;gt;[http://www.itu.int/rec/dologin_pub.asp?lang=e&amp;amp;id=T-REC-G.711-198811-I!!PDF-E&amp;amp;type=items/ &amp;quot;ITU-T Recommendation G.711&amp;quot;]&amp;lt;/ref&amp;gt;. Обратное преобразование выбирает значение преобразованного сигнала &amp;lt;math&amp;gt;y_t=f(x_t)&amp;lt;/math&amp;gt; из данного номера интервала и получает оценку исходного сигнала &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; f^{-1}(y_t) = sign(y_t)(1/\mu)((1+\mu)^{|y_t|}-1), -1 &amp;lt; y_t &amp;lt; 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В качестве представления звукового сигнала может выступать [https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0/ спектрограмма волны] {{---}} изображение, показывающее зависимость спектральной плотности мощности сигнала от времени. Спектрограммы отображают частоту и амплитуду сигнала во времени, но не содержат никакой информации о фазе сигнала, из-за чего результат обратного восстановления сигнала по спектрограмме неизбежно отличается от оригинала. Цифровая генерация спектрограммы сигнала &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; сводится к вычислению квадрата амплитуды [https://ru.wikipedia.org/wiki/%D0%9E%D0%BA%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5/ оконного преобразования Фурье]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;spectrogram(t, w) = |STFT(t, w)|^2&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; {{---}} используемое окно и &amp;lt;math&amp;gt;STFT(t, w)&amp;lt;/math&amp;gt; {{---}} оконное преобразование Фурье.&lt;br /&gt;
&lt;br /&gt;
Для восстановления исходного сигнала по его спектрограмме может быть использован алгоритм Гриффина-Лима&amp;lt;ref name=&amp;quot;griffin-lim&amp;quot;&amp;gt;D. Griffin and Jae Lim, &amp;quot;Signal estimation from modified short-time Fourier transform,&amp;quot; ICASSP '83. IEEE International Conference on Acoustics, Speech, and Signal Processing, Boston, Massachusetts, USA, 1983, pp. 804-807, doi: 10.1109/ICASSP.1983.1172092.&amp;lt;/ref&amp;gt;, который основан на минимизации среднеквадратичной ошибки между оконным преобразованием Фурье оцениваемого сигнала и имеющимся преобразованием в спектрограмме.&lt;br /&gt;
&lt;br /&gt;
== Классы подходов к синтезу речи ==&lt;br /&gt;
Основными требованиями к технологиям синтеза речи являются естественность (англ. naturalness) и разборчивость (англ. intelligibility).&lt;br /&gt;
Естественность описывает, насколько генерируемая речь близка к человеческой, а разборчивость отражает, насколько сложно понять речь.&lt;br /&gt;
Идеальный синтезатор речи генерирует одновременно и натуральную, и разборчивую речь.&lt;br /&gt;
=== Конкатенативный синтез ===&lt;br /&gt;
'''Конкатенативный синтез''' (англ. concatenative synthesis) основывается на конкатенации предварительно записанных примеров человеческой речи в единую звуковую последовательность. Данный подход синтезирует наиболее естественную речь, но генерируемая речь часто содержит значительные отличия и ошибки по сравнению с человеческой речью. Примеры конкатенативного синтеза:&lt;br /&gt;
&lt;br /&gt;
* '''Синтез с выбором''' (англ. unit selection synthesis) является самым используемым подходом конкатенативного синтеза и использует большую базу данных записанной речи. При создании базы данных записанные фразы могут делиться на различные звуковые единицы, такие, как фоны, дифоны, полуфоны, слоги, морфемы, целые фразы или предложения. При запуске алгоритм генерирует выходную звуковую волну с помощью выбора наилучшей последовательности звуковых единиц из базы данных. Данный выбор обычно реализован с помощью [[Дерево решений и случайный лес|дерева решений]]. Синтез с выбором обеспечивает наиболее естественную речь, так как использует минимальную цифровую обработку сигналов. Недостатком подхода является необходимость в довольно большой базе данных звуков для достижения наибольшей естественности речи. Данный подход являлся самым популярным для общего класса задач синтеза речи, но в последнее время уступает по популярности параметрическому подходу. Примером использования синтеза с выбором является голосовой помощник Siri от Apple &amp;lt;ref name=&amp;quot;apple&amp;quot;&amp;gt;[https://machinelearning.apple.com/research/siri-voices/ Deep Learning for Siri’s Voice: On-device Deep Mixture Density Networks for Hybrid Unit Selection Synthesis.]&amp;lt;/ref&amp;gt; и голосовой помощник Алиса от компании Яндекс &amp;lt;ref&amp;gt;[https://www.seonews.ru/analytics/optimization-2018-chto-nakhoditsya-pod-kapotom-u-alisy/ Optimization 2018: что находится «под капотом» у Алисы.]&amp;lt;/ref&amp;gt;. Несмотря на то, что эти продукты используют глубокое обучение, их механизм синтеза речи основан на записанных примерах голоса.&lt;br /&gt;
&lt;br /&gt;
* '''Дифонный синтез''' (англ. diphone synthesis) является частным случаем синтеза с выбором, который использует в качестве звуковых единиц дифоны (переход от звука к звуку). Подход использует только один образец каждого дифона. База данных дифонов при этом получается сравнительно небольшой. Например, немецкий язык содержит около 800 дифонов, а испанский {{---}} около 2500. При работе алгоритма просодия входной последовательности накладывается на дифоны в базе данных с помощью различных алгоритмов цифровой обработки сигналов. Данный алгоритм значительно уступает по качеству другим подходам и кроме меньшего размера базы данных не дает весомых преимуществ, из-за чего не снискал большой популярности.&lt;br /&gt;
&lt;br /&gt;
* '''Синтез речи, ограниченный предметной областью''' (англ. domain-specific speech synthesis) также является частным случаем синтеза с выбором и использует базу данных предварительно записанных слов, фраз и предложений для составления выходной последовательности. Он используется в задачах, где вариативность и размер используемых фраз ограничены некоторой предметной областью, например, прогнозирование погоды или составление расписания транспорта. Из-за значительной простоты реализации и использования данный подход уже долго применяется в коммерческих продуктах, например, говорящие часы или калькуляторы. При этом данный подход может обеспечивать высокую естественность речи вследствие ограниченности используемой базы данных. Недостатками таких систем является ограниченность областью применимости и неспособность учитывать контекст речи, что может вызывать ощутимые ошибки в некоторых языках.&lt;br /&gt;
&lt;br /&gt;
=== Параметрический синтез ===&lt;br /&gt;
Параметрический синтез (англ. statistical parametrical synthesis) для генерации выходной звуковой волны, в отличии от конкатенативного синтеза, не использует реальные примеры речи, а строит вероятностное распределение некоторых параметров и акустических свойств звуковой волны.&lt;br /&gt;
В начале работы параметрического синтезатора с помощью вокодера извлекаются параметры&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{o} = \{o_1, \dots, o_N\}&amp;lt;/math&amp;gt; звуковой волны и лингвистические данные &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; из текста, который необходимо озвучить. Конкретный вид вектора &amp;lt;math&amp;gt;\textbf{o}&amp;lt;/math&amp;gt; зависит от используемого вокодера {{---}} это может быть как спектрограмма волны, так и некоторое другое представление сигнала, например, дискретные номера интервалов числовой прямой, получаемые с помощью мю-закона. Затем, [[Порождающие модели|порождающая модель]], например, [[Марковская цепь|скрытая марковская цепь]],&lt;br /&gt;
[[Нейронные сети, перцептрон#Сети прямого распространения|нейронная сеть прямого распространения]] или [[Рекуррентные нейронные сети|рекуррентная нейронная сеть]], обучается по выделенным параметрам &amp;lt;math&amp;gt;\textbf{o}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;, получая параметры модели &amp;lt;math&amp;gt;\hat{\Lambda}&amp;lt;/math&amp;gt;, наиболее хорошо описывающие распределение &amp;lt;math&amp;gt;p(o|l, \Lambda)&amp;lt;/math&amp;gt;. На этапе синтеза, модель генерирует наиболее правдоподобные параметры звуковой волны, используя найденные на этапе обучения параметры модели &amp;lt;math&amp;gt;\hat{\Lambda}&amp;lt;/math&amp;gt; и лингвистическую информацию &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; текста, который необходимо озвучить:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{\textbf{o}} = \arg\max\limits_{\textbf{o}}p(\textbf{o} | l, \hat{\Lambda})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходная звуковая волна генерируется вокодером на основе найденных параметров &amp;lt;math&amp;gt;\hat{\textbf{o}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данный подход является самым популярным на сегодняшний момент, в том числе из-за того, что он позволяет использовать подходы, основанные на нейронных сетях. Современными продуктами, использующие основанный на глубоком обучении параметрический синтез являются Amazon Lex и Alexa &amp;lt;ref&amp;gt;[https://www.allthingsdistributed.com/2016/11/amazon-ai-and-alexa-for-all-aws-apps.html Bringing the Magic of Amazon AI and Alexa to Apps on AWS.] &amp;lt;/ref&amp;gt;, Google Ассистент &amp;lt;ref name=&amp;quot;cnet wavenet&amp;quot;&amp;gt;Martin, Taylor (May 9, 2018).[https://www.cnet.com/how-to/how-to-get-all-google-assistants-new-voices-right-now/  &amp;quot;Try the all-new Google Assistant voices right now&amp;quot;]. CNET.&amp;lt;/ref&amp;gt; и умные дисплеи Portal от Facebook &amp;lt;ref&amp;gt;[https://venturebeat.com/2020/05/15/facebooks-voice-synthesis-ai-generates-speech-in-500-milliseconds/ Facebook’s voice synthesis AI generates speech in 500 milliseconds.]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
== Алгоритмы, основанные на нейронных сетях ==&lt;br /&gt;
=== WaveNet ===&lt;br /&gt;
WaveNet&amp;lt;ref name=&amp;quot;wavenet&amp;quot;&amp;gt;Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&amp;lt;/ref&amp;gt; является [[Порождающие модели | порождающей моделью]], использующей параметрический подход к синтезу речи. Её задача {{---}} восстановить распределение вероятностей звукового сигнала&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{x} = \{x_1, x_2, \dots, x_T\}&amp;lt;/math&amp;gt; с помощью произведения условных вероятностей:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\textbf{x})=\prod\limits_{t=1}^{T} p(x_t | x_1, x_2, \dots, x_{t-1})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, вероятность каждого сигнала &amp;lt;math&amp;gt;x_t&amp;lt;/math&amp;gt; зависит только от предыдущих сигналов. Во время обучения модель оценивает данное условное распределение вероятностей, принимая на вход сигналы из обучающей выборки одновременно. На этапе генерации модель порождает выходные сигналы с помощью полученной оценки распределения вероятности последовательно {{---}} полученный моделью сигнал в момент времени &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; подается обратно на вход для генерации последующего сигнала в момент времени &amp;lt;math&amp;gt;t+1&amp;lt;/math&amp;gt;. Структура модели позволяет использовать её в широком спектре задач, например, в задачах продолжения музыкального произведения по его началу, порождения голоса конкретного человека или text-to-speech синтеза.&lt;br /&gt;
&lt;br /&gt;
Основной идеей модели является использование причинных сверточных сетей (англ. causal convolution layers) и [[Сверточные нейронные сети#Расширенная свертка (aнгл. Dilated convolution) | расширенных ]] причинных сверточных сетей (англю dilated causal convolution layers).&lt;br /&gt;
Причинная сверточная сеть представляет собой несколько уровней сверточной нейронной сети, связанных между собой в порядке, который не нарушает последовательность&lt;br /&gt;
входного сигнала, т.е. оцениваемая в момент времени &amp;lt;math&amp;gt;t+1&amp;lt;/math&amp;gt; вероятность сигнала &amp;lt;math&amp;gt;p(x_{t+1} | x_1, x_2, \dots, x_t)&amp;lt;/math&amp;gt; не зависит от сигналов&lt;br /&gt;
в последующие моменты времени &amp;lt;math&amp;gt;t+2, t+3, \dots, T&amp;lt;/math&amp;gt;. Причинные сверточные сети обучаются&lt;br /&gt;
быстрее, чем [[Рекуррентные нейронные сети | рекуррентные нейронные сети]], но требуют достаточно большого количества уровней для обеспечивания большого окна восприятия сигнала (англ. signal reception window) {{---}} количество предыдущих сигналов, от которых зависит оценка сигнала в текущий момент.&lt;br /&gt;
&lt;br /&gt;
[[Файл:dilated-causal-convolutions.png|thumb|300px| Рисунок 1 —  строение причинной сверточной сети (сверху) и расширенной причинной сверточной сети (снизу)&amp;lt;ref name=&amp;quot;wavenet&amp;quot;&amp;gt;Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
Модификация причинных сверточных сетей, расширенные причинные сверточные сети, способна увеличить окно восприятия сигнала в разы и является основной идеей модели WaveNet.&lt;br /&gt;
Модификация заключается в применении свертки к области размерности большей, чем её длина, пропуская входные связи с некоторым шагом. Данный подход аналогичен применению пулинга или свертки с шагом большим единицы, но выходом расширенной причинной сверточной сети является последовательность размерности, равной размерности входной последовательности. Расширенные причинные сверточные сети способны достигать большего окна&lt;br /&gt;
восприятия сигнала, используя меньшее количество уровней, при этом сохраняя вычислительную сложность причинных сверточных сетей. Структура причинных сверточных сетей изображена на Рисунке 1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:wavenet.png|thumb|300px| Рисунок 2 —  строение модели WaveNet &amp;lt;ref name=&amp;quot;wavenet&amp;quot;&amp;gt;Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
Полная структура модели WaveNet изображена на Рисунке 2. В качестве вокодера используется [[Синтез речи#Генерация звуковой волны | мю-закон]].&lt;br /&gt;
Модель представляет собой множество слоев сверточной нейронной сети, аналогично модели [[PixelRNN_и_PixelCNN | PixelCNN]].&lt;br /&gt;
Модель на вход принимает закодированную мю-законом последовательность сигналов &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; и, опционально, некоторую дополнительную информацию, обозначаемую как вектор параметров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, а на выходе возвращает распределение вероятностей для параметров мю-закона, по которым можно восстановить синтезированный сигнал. На этапе обучения входным сигналом &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; является пример звука из обучающей выборки, который подается на все входы одновременно. На этапе генерации входом модели &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; будут являться сигналы, порожденные ею в предыдущие моменты времени и передаваемые ей последовательно. Дополнительная информация &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, например, может содержать информацию о рассматриваемом тексте в задаче text-to-speech синтеза. &lt;br /&gt;
&lt;br /&gt;
Модель представляет собой набор из &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; [[Сверточные нейронные сети#Residual block | блоков с остаточной связью]], содержащих преобразование расширенной причинной свертки и функцию активации. Функция активации при этом аналогична функции, предложенной в модели Gated PixelCNN &amp;lt;ref&amp;gt;Aaron van den Oord, Nal Kalchbrenner, Oriol Vinyals, Lasse Espeholt, Alex Graves, &amp;amp; Koray Kavukcuoglu. (2016). Conditional Image Generation with PixelCNN Decoders. [https://arxiv.org/abs/1606.05328/ arXiv:1606.05328]&lt;br /&gt;
&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{y} = \tanh(W_{f, k} * \textbf{x}) \odot \sigma(W_{g,k}*\textbf{x})&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; {{---}} номер слоя модели, &amp;lt;math&amp;gt;f, g&amp;lt;/math&amp;gt; {{---}} индексы входов преобразования, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; {{---}} функция сигмоиды, &amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt; {{---}} операция свертки, &amp;lt;math&amp;gt;\odot&amp;lt;/math&amp;gt; {{---}} операция покомпонентного умножения векторов и &amp;lt;math&amp;gt;W&amp;lt;/math&amp;gt; {{---}} выученные параметры свертки.&lt;br /&gt;
&lt;br /&gt;
В случае использования дополнительной информации &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; модель оценивает распределение вероятностей звукового сигнала как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\textbf{x}|\textbf{h})=\prod\limits_{t=1}^{T} p(x_t | x_1, x_2, \dots, x_{t-1}, \textbf{h})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для использования дополнительной информации &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt; функция активации может использовать вектор &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt; глобально при вычислении каждой свертки как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{y} = \tanh(W_{f, k} * \textbf{x} + V_{f,k}^T\textbf{h}) \odot \sigma(W_{g,k}*\textbf{x}+V_{g,k}^T\textbf{h})&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;V_{f,k}&amp;lt;/math&amp;gt; {{---}} выученные параметры линейной проекции. В случае, когда размерность вектора &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt; меньше, чем размерность &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt;, можно использовать upsampling-преобразование сверточных сетей, чтобы получить вектор размерности &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; и использовать его вместо оригинального вектора &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt;. При этом &amp;lt;math&amp;gt;V_{f,k}*\textbf{h}&amp;lt;/math&amp;gt; будет являться операцией свертки размера 1.&lt;br /&gt;
&lt;br /&gt;
Самый известный пример применения WaveNet для синтеза речи является  технология Google Ассистент, которая использует WaveNet для генерации голосов ассистентов на различных&lt;br /&gt;
языках. Модель позволила значительно сократить количество записей речи актеров озвучки, требуемых для создания голосовой модели&amp;lt;ref name=&amp;quot;cnet wavenet&amp;quot;&amp;gt;Martin, Taylor (May 9, 2018).[https://www.cnet.com/how-to/how-to-get-all-google-assistants-new-voices-right-now/  &amp;quot;Try the all-new Google Assistant voices right now&amp;quot;]. CNET.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
=== Tacotron ===&lt;br /&gt;
[[Файл:Tacotron.PNG|thumb|300px| Рисунок 3 — строение модели Tacotron&amp;lt;ref name=&amp;quot;tacotron&amp;quot;&amp;gt;Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
[[Файл:Tacotron-cbhg.PNG|thumb|300px| Рисунок 4 —строение модуля CBHG модели Tacotron&amp;lt;ref name=&amp;quot;tacotron&amp;quot;&amp;gt;Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
Tacotron {{---}} модель&amp;lt;ref name=&amp;quot;tacotron&amp;quot;&amp;gt;Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&amp;lt;/ref&amp;gt; параметрического синтеза речи, основанная на подходе [[Механизм внимания | seq2seq]], разработанная Google и опубликованная в 2017 году. Модель состоит из кодера, декодера с [[Механизм внимания | вниманием]] и нейронной сети для&lt;br /&gt;
пост-процессинга сигнала. Схема модели изображена на Рисунке 2.&lt;br /&gt;
&lt;br /&gt;
Кодер и сеть пост-процессинга опираются на блок CBHG, схема которого изображена на Рисунке 3. Блок состоит из набора одномерных сверточных фильтров, за которыми следуют&lt;br /&gt;
шоссейные нейронные сети (англ. highway networks)&amp;lt;ref&amp;gt;Rupesh Kumar Srivastava, Klaus Greff, and J ̈urgen Schmidhuber. Highway networks. [https://arxiv.org/abs/1505.00387/ arXiv:1505.00387], 2015.&amp;lt;/ref&amp;gt;, являющиеся модификацией [[Долгая краткосрочная память | LSTM сетей]], и двунаправленный [[Долгая краткосрочная память#Управляемые рекуррентные нейроны | управляемый рекуррентный блок]]. Входная последовательность сначала обрабатывается &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;&lt;br /&gt;
наборами сверточных фильтров с размерностью &amp;lt;math&amp;gt;1, 2, \dots, K&amp;lt;/math&amp;gt;. Эти фильтры моделируют локальную и контекстно-зависимую информацию (по аналогии с моделированием униграмм,&lt;br /&gt;
биграмм, вплоть до &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;-грамм). Выход сверточного уровня далее обрабатывается шоссейной сетью для дальнейшего выделения параметров. В конце CBHG&lt;br /&gt;
используется управляемый рекуррентный блок, который для выделения параметров опирается на контекст перед рассматриваемым символом и после рассматриваемого символа.&lt;br /&gt;
&lt;br /&gt;
Задача кодера заключается в извлечении последовательных параметров из текста. Его входом является последовательность символов, в которой каждый символ был закодирован one-hot&lt;br /&gt;
кодированием и объединен в единый непрерывный вектор. К данному входу применяется ряд нелинейных преобразований в виде сети с бутылочным горлышком (англ. bottleneck layer), что позволяет улучшить&lt;br /&gt;
обобщаемость сети и ускорить сходимость. Модуль CBHG преобразует выход нелинейных преобразований в итоговое представление текста, которая передается в декодер.&lt;br /&gt;
&lt;br /&gt;
Декодер является рекуррентной нейронной сетью с вниманием, в которой запрос внимания генерируется каждый временной промежуток. Вектор контекста соединяется с выходом ячейки внимания&lt;br /&gt;
и подается на вход декодирующим рекуррентным нейронным сетям, которые являются управляемыми рекуррентными блоками. Выходом декодера является спектрограмма звуковой волны, которая&lt;br /&gt;
передается сети пост-обработки для генерации непосредственно звуковой волны.&lt;br /&gt;
&lt;br /&gt;
В качестве сети пост-обработки используется модуль CBHG, описанный ранее. После этого спектрограмма звуковой волны передается на вход [[Синтез речи#Генерация звуковой волны | алгоритму Гриффина-Лима]], который генерирует итоговую звуковую волну.&lt;br /&gt;
&lt;br /&gt;
Модель Tacotron была значительно улучшена в последующей модификации Tacotron 2 &amp;lt;ref&amp;gt;Jonathan Shen, Ruoming Pang, Ron J. Weiss, Mike Schuster, Navdeep Jaitly, Zongheng Yang, Zhifeng Chen, Yu Zhang, Yuxuan Wang, RJ Skerry-Ryan, Rif A. Saurous, Yannis Agiomyrgiannakis, &amp;amp; Yonghui Wu. (2018). Natural TTS Synthesis by Conditioning WaveNet on Mel Spectrogram Predictions. [https://arxiv.org/abs/1712.05884  arXiv:1712.05884].&amp;lt;/ref&amp;gt;, которая переработала исходную архитектуру Tacotron и объединила её с вокодером на основе WaveNet. Данная модель способна синтезировать речь высокого качества, принимая на вход только текст, который необходимо озвучить&amp;lt;ref name=&amp;quot;tacotron2&amp;quot;&amp;gt;[https://ai.googleblog.com/2017/12/tacotron-2-generating-human-like-speech.html/ Tacotron 2: Generating Human-like Speech from Text]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Проблемы ==&lt;br /&gt;
=== Задача обработки текста === &lt;br /&gt;
Алгоритмы обработки текста могут не справляться с обработкой определенных частей речи, таких, как аббревиатуры, числа и гетеронимы. Произношение определенных слов также зависит от контекста их применения. Большинство систем синтеза речи по тексту не способны выделять контекст предложений и используют различные эвристические подходы с целью различить омографы (слова с одинаковым написанием, но различным произношением).&lt;br /&gt;
=== Преобразование текста в фонемы ===&lt;br /&gt;
Процесс преобразования текста в фонемы обычно подразделяется на два подхода {{---}} словарный и основанный на правилах. Словарный подход использует словарь с записанными фонетическими представлениями слов и в процессе работы производит поиск в нем с целью конвертации слова в последовательность фонем. Основанный на правилах подход использует набор правил, которые применяются к словам или частям слов с целью выделения фонем. Оба эти подхода имеют существенные недостатки и требуют усовершенствования.&lt;br /&gt;
=== Оценка качества ===&lt;br /&gt;
На данный момент не существует единых критериев оценки качества синтезаторов речи. В каждом отдельном применении технологии синтеза речи могут быть в том числе свои критерии качества, связанные с предметной областью или используемым оборудованием. С другой стороны, ряд исследователей начали оценивать синтезаторы речи используя распространенные наборы данных для синтеза речи &amp;lt;ref&amp;gt;[http://festvox.org/blizzard/ Blizzard Challenge]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Популярной метрикой оценки естественности речи является '''средняя оценка мнения''' (англ. mean opinion score)&amp;lt;ref name=&amp;quot;mos&amp;quot;&amp;gt;[https://www.itu.int/rec/T-REC-P.800.2 ITU-T Recommendation P.800.2 : Mean opinion score interpretation and reporting]&amp;lt;/ref&amp;gt;. Она заключается в воспроизведении результатов работы синтезатора речи выборке людей, которые затем оценивают её качество по шкале от 1 до 5, в которой 1 означает &amp;quot;плохое&amp;quot; качество, 5 {{---}} &amp;quot;идеальное&amp;quot;. Итоговой оценкой является среднее арифметическое всех оценок. Данная метрика страдает от субъективности и предвзятости опрашиваемых людей, в частности, в подобного рода экспериментах опрашиваемые стремятся ставить оценки, располагающиеся на всей ширине интервала оценок&amp;lt;ref name=&amp;quot;bias&amp;quot;&amp;gt;Zielinski, Slawomir, Francis Rumsey, and Søren Bech. &amp;quot;On some biases encountered in modern audio quality listening tests-a review.&amp;quot; Journal of the Audio Engineering Society 56.6 (2008): 427-451.&amp;lt;/ref&amp;gt;. Из этого следует, что данная оценка не является абсолютной и её нельзя использовать для сравнения двух отдельных экспериментов кроме тех случаев, когда эксперимент поставлен особым образом, чтобы учесть данный недостаток, и даже в таком случае требуется статистический анализ данных, чтобы убедиться, что такое сравнение двух систем корректно&amp;lt;ref name=&amp;quot;mos&amp;quot;&amp;gt;[https://www.itu.int/rec/T-REC-P.800.2 ITU-T Recommendation P.800.2 : Mean opinion score interpretation and reporting]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Модели WaveNet, Tacotron и Tacotron 2 использовали среднюю оценку мнения для сравнения своей работы с естественным языком и другими подходами. Например, WaveNet достиг оценки 4.21 и 4.08 для американского варианта английского и путунхуа, по сравнению с оценками естественного языка 4.46 и 4.25 соответственно. Работа, описывающая модель Tacotron, сравнивала модель с другими разрабатываемыми подходами&amp;lt;ref&amp;gt;Heiga Zen, Yannis Agiomyrgiannakis, Niels Egberts, Fergus Henderson, and Przemysław Szczepa-niak. Fast, compact, and high quality LSTM-RNN based statistical parametric speech synthesizersfor mobile devices.Proceedings Interspeech, 2016&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Junyoung Chung, Caglar Gulcehre, KyungHyun Cho, and Yoshua Bengio.  Empirical evaluation ofgated recurrent neural networks on sequence modeling. [https://arxiv.org/abs/1412/3555 arXiv:1412.3555], 2014.&amp;lt;/ref&amp;gt;. Tacotron смог достичь оценки в 3.82 балла для американского варианта английского, когда параметрический подход достиг 3.69, а конкатенативный - 4.09. Tacotron 2 смог достичь оценки в 4.52 балла по сравнению с оценкой записанной речи в 4.58 балла&amp;lt;ref name=&amp;quot;tacotron2&amp;quot;&amp;gt;[https://ai.googleblog.com/2017/12/tacotron-2-generating-human-like-speech.html/ Tacotron 2: Generating Human-like Speech from Text]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
== См. также ==&lt;br /&gt;
&lt;br /&gt;
* [[Нейронные сети, перцептрон ]]&lt;br /&gt;
* [[Сверточные нейронные сети ]]&lt;br /&gt;
* [[ Рекуррентные нейронные сети ]]&lt;br /&gt;
* [[ Механизм внимания ]]&lt;br /&gt;
* [[ Распознавание речи ]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&lt;br /&gt;
* Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B8%D0%BD%D1%82%D0%B5%D0%B7_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=78786</id>
		<title>Синтез речи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B8%D0%BD%D1%82%D0%B5%D0%B7_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=78786"/>
				<updated>2021-01-18T14:55:24Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: Мелкие исправления, упрощены некоторые разделы, добавлена информация про оценки качества&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}[[Категория:Машинное обучение]]&lt;br /&gt;
'''Синтез речи''' (англ. speech synthesis) {{---}} процесс генерации компьютером человеческой речи. Компьютерная система, способная к синтезу речи, называется речевым синтезатором.&lt;br /&gt;
Система, генерирующая человеческую речь, основываясь на тексте, называется '''text-to-speech''' системой (сокр. TTS).&lt;br /&gt;
&lt;br /&gt;
В процессе человеческой речи нервная система транслирует некоторый текст или мысленный концепт в движение мышц, связанных с органами дыхания и речи. Затем производится генерация акустического сигнала с помощью потока воздуха из легких. Сигнал содержит как периодические компоненты (созданные с помощью вибрации органов речи), так и апериодические&lt;br /&gt;
(созданные окружающей средой и фоновым шумом). Используя изменяющиеся во времени сокращения мышц, меняются частотные характеристики акустического сигнала.&lt;br /&gt;
Задача систем генерации речи по тексту {{---}} симулировать данный процесс в каком-либо виде.&lt;br /&gt;
&lt;br /&gt;
== Этапы синтеза речи ==&lt;br /&gt;
Работу систем синтеза речи по тексту как правило можно разделить на два этапа, за которые отвечают два отдельных компонента {{---}} обработка текста и синтез речи.&lt;br /&gt;
&lt;br /&gt;
Первый этап обычно содержит несколько этапов [[Обработка естественного языка|обработки естественного языка]], такие как разбиение  на предложения, разбиение на слова, нормализация текста,&lt;br /&gt;
автоматическая морфологическая разметка и конвертация графем в фонемы (англ. grapheme-to-phoneme conversion, G2P).&lt;br /&gt;
Данный этап принимает в качестве входных параметров текст и возвращает последовательность фонем с различными выделенными лингвистическими особенностями.&lt;br /&gt;
&lt;br /&gt;
Этап синтеза речи, в свою очередь, принимает на вход последовательность фонем и возвращает синтезированную звуковую волну речи.&lt;br /&gt;
Данный этап обычно включает в себя алгоритмы предсказания [https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%81%D0%BE%D0%B4%D0%B8%D1%8F_(%D0%BB%D0%B8%D0%BD%D0%B3%D0%B2%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0)/ просодии] {{---}} характеристик речи, описывающих признаки, являющиеся дополнительными к основной артикуляции звука, такие как тон, ударение, громкость и т.д. &lt;br /&gt;
&lt;br /&gt;
== Генерация звуковой волны ==&lt;br /&gt;
&lt;br /&gt;
Обычно, синтезаторы речи не работают непосредственно с сигналом звуковой волны, а используют некоторое представление этого сигнала, например, спектрограмму. Алгоритм, способный выделить такие параметры и по ним обратно восстановить звуковую волну, называется '''вокодер''' (англ. voice encoder). Примерами таких алгоритмов являются мю-закон &amp;lt;ref name=&amp;quot;mu law&amp;quot;&amp;gt;[http://www.itu.int/rec/dologin_pub.asp?lang=e&amp;amp;id=T-REC-G.711-198811-I!!PDF-E&amp;amp;type=items/ &amp;quot;ITU-T Recommendation G.711&amp;quot;]&amp;lt;/ref&amp;gt; и восстановление сигнала по его спектрограмме. &lt;br /&gt;
&lt;br /&gt;
Мю-закон преобразует каждое значение дискретизированного сигнала &amp;lt;math&amp;gt;\textbf{x} = \{x_1, x_2, \dots, x_T\}&amp;lt;/math&amp;gt;  как&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(x_t) = sign(x_t) \frac{\ln(1+\mu|x_t|)}{\ln(1+\mu)}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\mu = 255&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1 &amp;lt; x_t &amp;lt; 1&amp;lt;/math&amp;gt;, а затем кодирует сигнал как двузначное шестнадцатеричное число, которое обозначает некоторый интервал на числовой прямой&amp;lt;ref name=&amp;quot;mu law&amp;quot;&amp;gt;[http://www.itu.int/rec/dologin_pub.asp?lang=e&amp;amp;id=T-REC-G.711-198811-I!!PDF-E&amp;amp;type=items/ &amp;quot;ITU-T Recommendation G.711&amp;quot;]&amp;lt;/ref&amp;gt;. Обратное преобразование выбирает значение преобразованного сигнала &amp;lt;math&amp;gt;y_t=f(x_t)&amp;lt;/math&amp;gt; из данного номера интервала и получает оценку исходного сигнала &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; f^{-1}(y_t) = sign(y_t)(1/\mu)((1+\mu)^{|y_t|}-1), -1 &amp;lt; y_t &amp;lt; 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В качестве представления звукового сигнала может выступать [https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0/ спектрограмма волны] - изображение, показывающее зависимость спектральной плотности мощности сигнала от времени. Спектрограммы отображают частоту и амплитуду сигнала во времени, но не содержат никакой информации о фазе сигнала, из-за чего результат обратного восстановления сигнала по спектрограмме неизбежно отличается от оригинала. Цифровая генерация спектрограммы сигнала &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; сводится к вычислению квадрата амплитуды [https://ru.wikipedia.org/wiki/%D0%9E%D0%BA%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5/ оконного преобразования Фурье]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;spectrogram(t, w) = |STFT(t, w)|^2&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; {{---}} используемое окно и &amp;lt;math&amp;gt;STFT(t, w)&amp;lt;/math&amp;gt; {{---}} оконное преобразование Фурье.&lt;br /&gt;
&lt;br /&gt;
Для восстановления исходного сигнала по его спектрограмме может быть использован алгоритм Гриффина-Лима&amp;lt;ref name=&amp;quot;griffin-lim&amp;quot;&amp;gt;D. Griffin and Jae Lim, &amp;quot;Signal estimation from modified short-time Fourier transform,&amp;quot; ICASSP '83. IEEE International Conference on Acoustics, Speech, and Signal Processing, Boston, Massachusetts, USA, 1983, pp. 804-807, doi: 10.1109/ICASSP.1983.1172092.&amp;lt;/ref&amp;gt;, который основан на минимизации среднеквадратичной ошибки между оконным преобразованием Фурье оцениваемого сигнала и имеющимся преобразованием в спектрограмме.&lt;br /&gt;
&lt;br /&gt;
== Классы подходов к синтезу речи ==&lt;br /&gt;
Основными требованиями к технологиям синтеза речи являются естественность (англ. naturalness) и разборчивость (англ. intelligibility).&lt;br /&gt;
Естественность описывает, насколько генерируемая речь близка к человеческой, а разборчивость отражает, насколько сложно понять речь.&lt;br /&gt;
Идеальный синтезатор речи генерирует одновременно и натуральную, и разборчивую речь.&lt;br /&gt;
=== Конкатенативный синтез ===&lt;br /&gt;
'''Конкатенативный синтез''' (англ. concatenative synthesis) основывается на конкатенации предварительно записанных примеров человеческой речи в единую звуковую последовательность. Данный подход синтезирует наиболее естественную речь, но генерируемая речь часто содержит значительные отличия и ошибки по сравнению с человеческой речью. Примеры конкатенативного синтеза:&lt;br /&gt;
&lt;br /&gt;
* '''Синтез с выбором''' (англ. unit selection synthesis) является самым используемым подходом конкатенативного синтеза и использует большую базу данных записанной речи. При создании базы данных записанные фразы могут делиться на различные звуковые единицы, такие, как фоны, дифоны, полуфоны, слоги, морфемы, целые фразы или предложения. При запуске алгоритм генерирует выходную звуковую волну с помощью выбора наилучшей последовательности звуковых единиц из базы данных. Данный выбор обычно реализован с помощью [[Дерево решений и случайный лес|дерева решений]]. Синтез с выбором обеспечивает наиболее естественную речь, так как использует минимальную цифровую обработку сигналов. Недостатком подхода является необходимость в довольно большой базе данных звуков для достижения наибольшей естественности речи. Данный подход являлся самым популярным для общего класса задач синтеза речи, но в последнее время уступает по популярности параметрическому подходу. Примером использования синтеза с выбором является голосовой помощник Siri от Apple &amp;lt;ref name=&amp;quot;apple&amp;quot;&amp;gt;[https://machinelearning.apple.com/research/siri-voices/ Deep Learning for Siri’s Voice: On-device Deep Mixture Density Networks for Hybrid Unit Selection Synthesis.]&amp;lt;/ref&amp;gt; и голосовой помощник Алиса от компании Яндекс &amp;lt;ref&amp;gt;[https://www.seonews.ru/analytics/optimization-2018-chto-nakhoditsya-pod-kapotom-u-alisy/ Optimization 2018: что находится «под капотом» у Алисы.]&amp;lt;/ref&amp;gt;. Несмотря на то, что эти продукты используют глубокое обучение, их механизм синтеза речи основан на записанных примерах голоса.&lt;br /&gt;
&lt;br /&gt;
* '''Дифонный синтез''' (англ. diphone synthesis) является частным случаем синтеза с выбором, который использует в качестве звуковых единиц дифоны (переход от звука к звуку). Подход использует только один образец каждого дифона. База данных дифонов при этом получается сравнительно небольшой. Например, немецкий язык содержит около 800 дифонов, а испанский {{---}} около 2500. При работе алгоритма просодия входной последовательности накладывается на дифоны в базе данных с помощью различных алгоритмов цифровой обработки сигналов. Данный алгоритм значительно уступает по качеству другим подходам и кроме меньшего размера базы данных не дает весомых преимуществ, из-за чего не снискал большой популярности.&lt;br /&gt;
&lt;br /&gt;
* '''Синтез речи, ограниченный предметной областью''' (англ. domain-specific speech synthesis) также является частным случаем синтеза с выбором и использует базу данных предварительно записанных слов, фраз и предложений для составления выходной последовательности. Он используется в задачах, где вариативность и размер используемых фраз ограничены некоторой предметной областью, например, прогнозирование погоды или составление расписания транспорта. Из-за значительной простоты реализации и использования данный подход уже долго применяется в коммерческих продуктах, например, говорящие часы или калькуляторы. При этом данный подход может обеспечивать высокую естественность речи вследствие ограниченности используемой базы данных. Недостатками таких систем является ограниченность областью применимости и неспособность учитывать контекст речи, что может вызывать ощутимые ошибки в некоторых языках.&lt;br /&gt;
&lt;br /&gt;
=== Параметрический синтез ===&lt;br /&gt;
Параметрический синтез (англ. statistical parametrical synthesis) для генерации выходной звуковой волны, в отличии от конкатенативного синтеза, не использует реальные примеры речи, а строит вероятностное распределение некоторых параметров и акустических свойств звуковой волны.&lt;br /&gt;
В начале работы параметрического синтезатора с помощью вокодера извлекаются параметры&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{o} = \{o_1, \dots, o_N\}&amp;lt;/math&amp;gt; звуковой волны и лингвистические данные &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; из текста, который необходимо озвучить. Конкретный вид вектора &amp;lt;math&amp;gt;\textbf{o}&amp;lt;/math&amp;gt; зависит от используемого вокодера {{---}} это может быть как спектрограмма волны, так и некоторое другое представление сигнала, например, дискретные номера интервалов числовой прямой, получаемые с помощью мю-закона. Затем, [[Порождающие модели|порождающая модель]], например, [[Марковская цепь|скрытая марковская цепь]],&lt;br /&gt;
[[Нейронные сети, перцептрон#Сети прямого распространения|нейронная сеть прямого распространения]] или [[Рекуррентные нейронные сети|рекуррентная нейронная сеть]], обучается по выделенным параметрам &amp;lt;math&amp;gt;\textbf{o}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;, получая параметры модели &amp;lt;math&amp;gt;\hat{\Lambda}&amp;lt;/math&amp;gt; как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{\Lambda} = \arg\max\limits_{\Lambda}p(\textbf{o} | l, \Lambda)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На этапе синтеза, модель генерирует наиболее правдоподобные параметры звуковой волны, используя найденные на этапе обучения параметры модели &amp;lt;math&amp;gt;\hat{\Lambda}&amp;lt;/math&amp;gt; и лингвистическую информацию &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; текста, который необходимо озвучить:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{\textbf{o}} = \arg\max\limits_{\textbf{o}}p(\textbf{o} | l, \hat{\Lambda})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходная звуковая волна моделируется с помощью вокодера и найденных параметров &amp;lt;math&amp;gt;\hat{\textbf{o}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данный подход является самым популярным на сегодняшний момент, в том числе из-за того, что он позволяет использовать подходы, основанные на нейронных сетях. Современными продуктами, использующие основанный на глубоком обучении параметрический синтез являются Amazon Lex и Alexa &amp;lt;ref&amp;gt;[https://www.allthingsdistributed.com/2016/11/amazon-ai-and-alexa-for-all-aws-apps.html Bringing the Magic of Amazon AI and Alexa to Apps on AWS.] &amp;lt;/ref&amp;gt;, Google Ассистент &amp;lt;ref name=&amp;quot;cnet wavenet&amp;quot;&amp;gt;Martin, Taylor (May 9, 2018).[https://www.cnet.com/how-to/how-to-get-all-google-assistants-new-voices-right-now/  &amp;quot;Try the all-new Google Assistant voices right now&amp;quot;]. CNET.&amp;lt;/ref&amp;gt; и умные дисплеи Portal от Facebook &amp;lt;ref&amp;gt;[https://venturebeat.com/2020/05/15/facebooks-voice-synthesis-ai-generates-speech-in-500-milliseconds/ Facebook’s voice synthesis AI generates speech in 500 milliseconds.]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
== Алгоритмы, основанные на нейронных сетях ==&lt;br /&gt;
=== WaveNet ===&lt;br /&gt;
WaveNet&amp;lt;ref name=&amp;quot;wavenet&amp;quot;&amp;gt;Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&amp;lt;/ref&amp;gt; является [[Порождающие модели | порождающей моделью]], использующей параметрический подход к синтезу речи. Её задача {{---}} восстановить распределение вероятностей звукового сигнала&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{x} = \{x_1, x_2, \dots, x_T\}&amp;lt;/math&amp;gt; с помощью произведения условных вероятностей:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\textbf{x})=\prod\limits_{t=1}^{T} p(x_t | x_1, x_2, \dots, x_{t-1})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, вероятность каждого сигнала &amp;lt;math&amp;gt;x_t&amp;lt;/math&amp;gt; зависит от вероятностей предыдущих сигналов. Во время обучения модель оценивает данное условное распределение вероятностей, принимая на вход сигналы из обучающей выборки одновременно. На этапе генерации модель порождает выходные сигналы с помощью полученной оценки распределения вероятности последовательно {{---}} полученный моделью сигнал в момент времени &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; подается обратно на вход для генерации последующего сигнала в момент времени &amp;lt;math&amp;gt;t+1&amp;lt;/math&amp;gt;. Структура модели позволяет использовать её в широком спектре задач, например, в задачах продолжения музыкального произведения по его началу, порождения голоса конкретного человека или text-to-speech синтеза.&lt;br /&gt;
&lt;br /&gt;
Основной идеей модели является использование причинных сверточных сетей (англ. causal convolution layers) и [[Сверточные нейронные сети#Расширенная свертка (aнгл. Dilated convolution) | расширенных ]] причинных сверточных сетей (англю dilated causal convolution layers).&lt;br /&gt;
Причинная сверточная сеть представляет собой несколько уровней сверточной нейронной сети, связанных между собой в порядке, который не нарушает последовательность&lt;br /&gt;
входного сигнала, т.е. оцениваемая в момент времени &amp;lt;math&amp;gt;t+1&amp;lt;/math&amp;gt; вероятность сигнала &amp;lt;math&amp;gt;p(x_{t+1} | x_1, x_2, \dots, x_t)&amp;lt;/math&amp;gt; не зависит от сигналов&lt;br /&gt;
в последующие моменты времени &amp;lt;math&amp;gt;t+2, t+3, \dots, T&amp;lt;/math&amp;gt;. Причинные сверточные сети обучаются&lt;br /&gt;
быстрее, чем [[Рекуррентные нейронные сети | рекуррентные нейронные сети]], но требуют достаточно большого количества уровней для обеспечивания большого окна восприятия сигнала (англ. signal reception window) {{---}} количество предыдущих сигналов, от которых зависит оценка сигнала в текущий момент.&lt;br /&gt;
&lt;br /&gt;
[[Файл:dilated-causal-convolutions.png|thumb|300px| Рисунок 1 —  строение причинной сверточной сети (сверху) и расширенной причинной сверточной сети (снизу)&amp;lt;ref name=&amp;quot;wavenet&amp;quot;&amp;gt;Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
Модификация причинных сверточных сетей, расширенные причинные сверточные сети, способна увеличить окно восприятия сигнала в разы и является основной идеей модели WaveNet.&lt;br /&gt;
Модификация заключается в применении свертки к области размерности большей, чем её длина, пропуская входные связи с некоторым шагом. Данный подход аналогичен применению пулинга или свертки с шагом большим единицы, но выходом расширенной причинной сверточной сети является последовательность размерности, равной размерности входной последовательности. Расширенные причинные сверточные сети способны достигать большего окна&lt;br /&gt;
восприятия сигнала, используя меньшее количество уровней, при этом сохраняя вычислительную сложность причинных сверточных сетей. Структура причинных сверточных сетей изображена на Рисунке 1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:wavenet.png|thumb|300px| Рисунок 2 —  строение модели WaveNet &amp;lt;ref name=&amp;quot;wavenet&amp;quot;&amp;gt;Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
Полная структура модели WaveNet изображена на Рисунке 2. В качестве вокодера используется [[Синтез речи#Генерация звуковой волны | мю-закон]].&lt;br /&gt;
Модель представляет собой множество слоев сверточной нейронной сети, аналогично модели [[PixelRNN_и_PixelCNN | PixelCNN]].&lt;br /&gt;
Модель на вход принимает закодированную мю-законом последовательность сигналов &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; и, опционально, некоторую дополнительную информацию, обозначаемую как вектор параметров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, а на выходе возвращает распределение вероятностей для параметров мю-закона, по которым можно восстановить синтезированный сигнал. На этапе обучения входным сигналом &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; является пример звука из обучающей выборки, который подается на все входы одновременно. На этапе генерации входом модели &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; будут являться сигналы, порожденные ею в предыдущие моменты времени и передаваемые ей последовательно. Дополнительная информация &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, например, может содержать информацию о рассматриваемом тексте в задаче text-to-speech синтеза. &lt;br /&gt;
&lt;br /&gt;
Модель представляет собой набор из &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; [[Сверточные нейронные сети#Residual block | блоков с остаточной связью]], содержащих преобразование расширенной причинной свертки и функцию активации. Функция активации при этом аналогична функции, предложенной в модели Gated PixelCNN &amp;lt;ref&amp;gt;Aaron van den Oord, Nal Kalchbrenner, Oriol Vinyals, Lasse Espeholt, Alex Graves, &amp;amp; Koray Kavukcuoglu. (2016). Conditional Image Generation with PixelCNN Decoders. [https://arxiv.org/abs/1606.05328/ arXiv:1606.05328]&lt;br /&gt;
&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{y} = \tanh(W_{f, k} * \textbf{x}) \odot \sigma(W_{g,k}*\textbf{x})&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; {{---}} номер слоя модели, &amp;lt;math&amp;gt;f, g&amp;lt;/math&amp;gt; {{---}} индексы входов преобразования, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; {{---}} функция сигмоиды, &amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt; {{---}} операция свертки, &amp;lt;math&amp;gt;\odot&amp;lt;/math&amp;gt; {{---}} операция покомпонентного умножения векторов и &amp;lt;math&amp;gt;W&amp;lt;/math&amp;gt; {{---}} выученные параметры свертки.&lt;br /&gt;
&lt;br /&gt;
В случае использования дополнительной информации &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; модель оценивает распределение вероятностей звукового сигнала как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\textbf{x}|\textbf{h})=\prod\limits_{t=1}^{T} p(x_t | x_1, x_2, \dots, x_{t-1}, \textbf{h})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для использования дополнительной информации &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt; функция активации может использовать вектор &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt; глобально при вычислении каждой свертки как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{y} = \tanh(W_{f, k} * \textbf{x} + V_{f,k}^T\textbf{h}) \odot \sigma(W_{g,k}*\textbf{x}+V_{g,k}^T\textbf{h})&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;V_{f,k}&amp;lt;/math&amp;gt; {{---}} выученные параметры линейной проекции. В случае, когда размерность вектора &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt; меньше, чем размерность &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt;, можно использовать upsampling-преобразование сверточных сетей, чтобы получить вектор размерности &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; и использовать его вместо оригинального вектора &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt;. При этом &amp;lt;math&amp;gt;V_{f,k}*\textbf{h}&amp;lt;/math&amp;gt; будет являться операцией свертки размера 1.&lt;br /&gt;
&lt;br /&gt;
Самый известный пример применения WaveNet для синтеза речи является  технология Google Ассистент, которая использует WaveNet для генерации голосов ассистентов на различных&lt;br /&gt;
языках. Модель позволила значительно сократить количество записей речи актеров озвучки, требуемых для создания голосовой модели&amp;lt;ref name=&amp;quot;cnet wavenet&amp;quot;&amp;gt;Martin, Taylor (May 9, 2018).[https://www.cnet.com/how-to/how-to-get-all-google-assistants-new-voices-right-now/  &amp;quot;Try the all-new Google Assistant voices right now&amp;quot;]. CNET.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
=== Tacotron ===&lt;br /&gt;
[[Файл:Tacotron.PNG|thumb|300px| Рисунок 3 — строение модели Tacotron&amp;lt;ref name=&amp;quot;tacotron&amp;quot;&amp;gt;Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
[[Файл:Tacotron-cbhg.PNG|thumb|300px| Рисунок 4 —строение модуля CBHG модели Tacotron&amp;lt;ref name=&amp;quot;tacotron&amp;quot;&amp;gt;Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
Tacotron {{---}} модель&amp;lt;ref name=&amp;quot;tacotron&amp;quot;&amp;gt;Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&amp;lt;/ref&amp;gt; параметрического синтеза речи, основанная на подходе [[Механизм внимания | seq2seq]], разработанная Google и опубликованная в 2017 году. Модель состоит из кодера, декодера с [[Механизм внимания | вниманием]] и нейронной сети для&lt;br /&gt;
пост-процессинга сигнала. Схема модели изображена на Рисунке 2.&lt;br /&gt;
&lt;br /&gt;
Кодер и сеть пост-процессинга опираются на блок CBHG, схема которого изображена на Рисунке 3. Блок состоит из набора одномерных сверточных фильтров, за которыми следуют&lt;br /&gt;
шоссейные нейронные сети (англ. highway networks)&amp;lt;ref&amp;gt;Rupesh Kumar Srivastava, Klaus Greff, and J ̈urgen Schmidhuber. Highway networks. [https://arxiv.org/abs/1505.00387/ arXiv:1505.00387], 2015.&amp;lt;/ref&amp;gt;, являющиеся модификацией [[Долгая краткосрочная память | LSTM сетей]], и двунаправленный [[Долгая краткосрочная память#Управляемые рекуррентные нейроны | управляемый рекуррентный блок]]. Входная последовательность сначала обрабатывается &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;&lt;br /&gt;
наборами сверточных фильтров с размерностью &amp;lt;math&amp;gt;1, 2, \dots, K&amp;lt;/math&amp;gt;. Эти фильтры моделируют локальную и контекстно-зависимую информацию (по аналогии с моделированием униграмм,&lt;br /&gt;
биграмм, вплоть до &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;-грамм). Выход сверточного уровня далее обрабатывается шоссейной сетью для дальнейшего выделения параметров. В конце CBHG&lt;br /&gt;
используется управляемый рекуррентный блок, который для выделения параметров опирается на контекст перед рассматриваемым символом и после рассматриваемого символа.&lt;br /&gt;
&lt;br /&gt;
Задача кодера заключается в извлечении последовательных параметров из текста. Его входом является последовательность символов, в которой каждый символ был закодирован one-hot&lt;br /&gt;
кодированием и объединен в единый непрерывный вектор. К данному входу применяется ряд нелинейных преобразований в виде сети с бутылочным горлышком (англ. bottleneck layer), что позволяет улучшить&lt;br /&gt;
обобщаемость сети и ускорить сходимость. Модуль CBHG преобразует выход нелинейных преобразований в итоговое представление текста, которая передается в декодер.&lt;br /&gt;
&lt;br /&gt;
Декодер является рекуррентной нейронной сетью с вниманием, в которой запрос внимания генерируется каждый временной промежуток. Вектор контекста соединяется с выходом ячейки внимания&lt;br /&gt;
и подается на вход декодирующим рекуррентным нейронным сетям, которые являются управляемыми рекуррентными блоками. Выходом декодера является спектрограмма звуковой волны, которая&lt;br /&gt;
передается сети пост-обработки для генерации непосредственно звуковой волны.&lt;br /&gt;
&lt;br /&gt;
В качестве сети пост-обработки используется модуль CBHG, описанный ранее. После этого спектрограмма звуковой волны передается на вход [[Синтез речи#Генерация звуковой волны | алгоритму Гриффина-Лима]], который генерирует итоговую звуковую волну.&lt;br /&gt;
&lt;br /&gt;
Модель Tacotron была значительно улучшена в последующей модификации Tacotron 2 &amp;lt;ref&amp;gt;Jonathan Shen, Ruoming Pang, Ron J. Weiss, Mike Schuster, Navdeep Jaitly, Zongheng Yang, Zhifeng Chen, Yu Zhang, Yuxuan Wang, RJ Skerry-Ryan, Rif A. Saurous, Yannis Agiomyrgiannakis, &amp;amp; Yonghui Wu. (2018). Natural TTS Synthesis by Conditioning WaveNet on Mel Spectrogram Predictions. [https://arxiv.org/abs/1712.05884  arXiv:1712.05884].&amp;lt;/ref&amp;gt;, которая переработала исходную архитектуру Tacotron и объединила её с вокодером на основе WaveNet. Данная модель способна синтезировать речь высокого качества, принимая на вход только текст, который необходимо озвучить&amp;lt;ref name=&amp;quot;tacotron2&amp;quot;&amp;gt;[https://ai.googleblog.com/2017/12/tacotron-2-generating-human-like-speech.html/ Tacotron 2: Generating Human-like Speech from Text]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Проблемы ==&lt;br /&gt;
=== Задача обработки текста === &lt;br /&gt;
Алгоритмы обработки текста могут не справляться с обработкой определенных частей речи, таких, как аббревиатуры, числа и гетеронимы. Произношение определенных слов также зависит от контекста их применения. Большинство систем синтеза речи по тексту не способны выделять контекст предложений и используют различные эвристические подходы с целью различить омографы (слова с одинаковым написанием, но различным произношением).&lt;br /&gt;
=== Преобразование текста в фонемы ===&lt;br /&gt;
Процесс преобразования текста в фонемы обычно подразделяется на два подхода {{---}} словарный и основанный на правилах. Словарный подход использует словарь с записанными фонетическими представлениями слов и в процессе работы производит поиск в нем с целью конвертации слова в последовательность фонем. Основанный на правилах подход использует набор правил, которые применяются к словам или частям слов с целью выделения фонем. Оба эти подхода имеют существенные недостатки и требуют усовершенствования.&lt;br /&gt;
=== Оценка качества ===&lt;br /&gt;
На данный момент не существует единых критериев оценки качества синтезаторов речи. В каждом отдельном применении технологии синтеза речи могут быть в том числе свои критерии качества, связанные с предметной областью или используемым оборудованием. С другой стороны, ряд исследователей начали оценивать синтезаторы речи используя распространенные наборы данных для синтеза речи &amp;lt;ref&amp;gt;[http://festvox.org/blizzard/ Blizzard Challenge]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Популярной метрикой оценки естественности речи является '''средняя оценка мнения''' (англ. mean opinion score)&amp;lt;ref name=&amp;quot;mos&amp;quot;&amp;gt;[https://www.itu.int/rec/T-REC-P.800.2 ITU-T Recommendation P.800.2 : Mean opinion score interpretation and reporting]&amp;lt;/ref&amp;gt;. Она заключается в воспроизведении результатов работы синтезатора речи выборке людей, которые затем оценивают её качество по шкале от 1 до 5, в которой 1 означает &amp;quot;плохое&amp;quot; качество, 5 {{---}} &amp;quot;идеальное&amp;quot;. Итоговой оценкой является среднее арифметическое всех оценок. Данная метрика страдает от субъективности и предвзятости опрашиваемых людей, в частности, в подобного рода экспериментах опрашиваемые стремятся ставить оценки, располагающиеся на всей ширине интервала оценок&amp;lt;ref name=&amp;quot;bias&amp;quot;&amp;gt;Zielinski, Slawomir, Francis Rumsey, and Søren Bech. &amp;quot;On some biases encountered in modern audio quality listening tests-a review.&amp;quot; Journal of the Audio Engineering Society 56.6 (2008): 427-451.&amp;lt;/ref&amp;gt;. Из этого следует, что данная оценка не является абсолютной и её нельзя использовать для сравнения двух отдельных экспериментов кроме тех случаев, когда эксперимент поставлен особым образом, чтобы учесть данный недостаток, и даже в таком случае требуется статистический анализ данных, чтобы убедиться, что такое сравнение двух систем корректно&amp;lt;ref name=&amp;quot;mos&amp;quot;&amp;gt;[https://www.itu.int/rec/T-REC-P.800.2 ITU-T Recommendation P.800.2 : Mean opinion score interpretation and reporting]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Модели WaveNet, Tacotron и Tacotron 2 использовали среднюю оценку мнения для сравнения своей работы с естественным языком и другими подходами. Например, WaveNet достиг оценки 4.21 и 4.08 для американского варианта английского и путунхуа, по сравнению с оценками естественного языка 4.46 и 4.25 соответственно. Работа, описывающая модель Tacotron, сравнивала модель с другими разрабатываемыми подходами&amp;lt;ref&amp;gt;Heiga Zen, Yannis Agiomyrgiannakis, Niels Egberts, Fergus Henderson, and Przemysław Szczepa-niak. Fast, compact, and high quality LSTM-RNN based statistical parametric speech synthesizersfor mobile devices.Proceedings Interspeech, 2016&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Junyoung Chung, Caglar Gulcehre, KyungHyun Cho, and Yoshua Bengio.  Empirical evaluation ofgated recurrent neural networks on sequence modeling. [https://arxiv.org/abs/1412/3555 arXiv:1412.3555], 2014.&amp;lt;/ref&amp;gt;. Tacotron смог достичь оценки в 3.82 балла для американского варианта английского, когда параметрический подход достиг 3.69, а конкатенативный - 4.09. Tacotron 2 смог достичь оценки в 4.52 балла по сравнению с оценкой записанной речи в 4.58 балла&amp;lt;ref name=&amp;quot;tacotron2&amp;quot;&amp;gt;[https://ai.googleblog.com/2017/12/tacotron-2-generating-human-like-speech.html/ Tacotron 2: Generating Human-like Speech from Text]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
== См. также ==&lt;br /&gt;
&lt;br /&gt;
* [[Нейронные сети, перцептрон ]]&lt;br /&gt;
* [[Сверточные нейронные сети ]]&lt;br /&gt;
* [[ Рекуррентные нейронные сети ]]&lt;br /&gt;
* [[ Механизм внимания ]]&lt;br /&gt;
* [[ Распознавание речи ]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&lt;br /&gt;
* Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Wavenet.png&amp;diff=78785</id>
		<title>Файл:Wavenet.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Wavenet.png&amp;diff=78785"/>
				<updated>2021-01-18T14:54:05Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: VerlorenMind загрузил новую версию Файл:Wavenet.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B8%D0%BD%D1%82%D0%B5%D0%B7_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=78601</id>
		<title>Синтез речи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B8%D0%BD%D1%82%D0%B5%D0%B7_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=78601"/>
				<updated>2021-01-15T15:55:52Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}[[Категория:Машинное обучение]]&lt;br /&gt;
'''Синтез речи''' (англ. speech synthesis) {{---}} процесс генерации компьютером человеческой речи. Компьютерная система, способная к синтезу речи, называется речевым синтезатором.&lt;br /&gt;
Система, генерирующая человеческую речь, основываясь на тексте, называется '''text-to-speech''' системой (сокр. TTS).&lt;br /&gt;
&lt;br /&gt;
В процессе человеческой речи нервная система транслирует некоторый текст или мысленный концепт в движение мышц, связанных с органами дыхания и речи. Затем производится генерация акустического сигнала с помощью потока воздуха из легких. Сигнал содержит как периодические компоненты (созданные с помощью вибрации органов речи), так и апериодические&lt;br /&gt;
(созданные окружающей средой и фоновым шумом). Используя изменяющиеся во времени сокращения мышц, меняются частотные характеристики акустического сигнала.&lt;br /&gt;
Задача систем генерации речи по тексту {{---}} симулировать данный процесс в каком-либо виде.&lt;br /&gt;
&lt;br /&gt;
== Этапы синтеза речи ==&lt;br /&gt;
Работу систем синтеза речи по тексту, как правило, можно разделить на два этапа, за которые отвечают два отдельных компонента {{---}} обработка текста и синтез речи.&lt;br /&gt;
&lt;br /&gt;
Первый этап обычно содержит несколько этапов [[Обработка естественного языка|обработки естественного языка]], такие, как разбиение  на предложения, разбиение на слова, нормализация текста,&lt;br /&gt;
автоматическая морфологическая разметка и конвертация графем в фонемы (англ. grapheme-to-phoneme conversion, G2P).&lt;br /&gt;
Данный этап принимает в качестве входных параметров текст и возвращает последовательность фонем с различными выделенными лингвистическими особенностями.&lt;br /&gt;
&lt;br /&gt;
Этап синтеза речи, в свою очередь, принимает на вход последовательность фонем и возвращает синтезированную звуковую волну речи.&lt;br /&gt;
Данный этап обычно включает в себя алгоритмы предсказания [https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%81%D0%BE%D0%B4%D0%B8%D1%8F_(%D0%BB%D0%B8%D0%BD%D0%B3%D0%B2%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0)/ просодии] - характеристик речи, описывающих признаки, являющиеся дополнительными к основной артикуляции звука, такие, как тон, ударение, громкость и т.д. &lt;br /&gt;
&lt;br /&gt;
== Генерация звуковой волны ==&lt;br /&gt;
&lt;br /&gt;
Обычно, синтезаторы речи не работают непосредственно с сигналом звуковой волны, а использует некоторое представление этого сигнала, например, спектрограмму. Алгоритм, способный выделить такие параметры и по ним обратно восстановить звуковую волну, называется '''вокодер''' (англ. voice encoder). Примерами таких алгоритмов являются мю-закон &amp;lt;ref name=&amp;quot;mu law&amp;quot;&amp;gt;[http://www.itu.int/rec/dologin_pub.asp?lang=e&amp;amp;id=T-REC-G.711-198811-I!!PDF-E&amp;amp;type=items/ &amp;quot;ITU-T Recommendation G.711&amp;quot;]&amp;lt;/ref&amp;gt; и восстановление сигнала по его спектрограмме. &lt;br /&gt;
&lt;br /&gt;
Мю-закон преобразует каждое значение дискретизированного сигнала &amp;lt;math&amp;gt;\textbf{x} = \{x_1, x_2, \dots, x_T\}&amp;lt;/math&amp;gt;  как&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(x_t) = sign(x_t) \frac{\ln(1+\mu|x_t|)}{\ln(1+\mu)}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\mu = 255&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1 &amp;lt; x_t &amp;lt; 1&amp;lt;/math&amp;gt;, а затем кодирует сигнал как двузначное шестнадцатеричное число, которое обозначает некоторый интервал на числовой прямой&amp;lt;ref name=&amp;quot;mu law&amp;quot;&amp;gt;[http://www.itu.int/rec/dologin_pub.asp?lang=e&amp;amp;id=T-REC-G.711-198811-I!!PDF-E&amp;amp;type=items/ &amp;quot;ITU-T Recommendation G.711&amp;quot;]&amp;lt;/ref&amp;gt;. Обратное преобразование выбирает значение преобразованного сигнала &amp;lt;math&amp;gt;y_t=f(x_t)&amp;lt;/math&amp;gt; из данного номера интервала и получает оценку исходного сигнала &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; f^{-1}(y_t) = sign(y_t)(1/\mu)((1+\mu)^{|y_t|}-1), -1 &amp;lt; y_t &amp;lt; 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В качестве представления звукового сигнала может выступать [https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0/ спектрограмма волны] - изображение, показывающее зависимость спектральной плотности мощности сигнала от времени. Спектрограммы отображают частоту и амплитуду сигнала во времени, но не содержат никакой информации о фазе сигнала, из-за чего результат обратного восстановления сигнала по спектрограмме неизбежно отличается от оригинала. Цифровая генерация спектрограммы сигнала &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; сводится к вычислению квадрата амплитуды [https://ru.wikipedia.org/wiki/%D0%9E%D0%BA%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5/ оконного преобразования Фурье]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;spectrogram(t, w) = |STFT(t, w)|^2&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; {{---}} используемое окно и &amp;lt;math&amp;gt;STFT(t, w)&amp;lt;/math&amp;gt; {{---}} оконное преобразование Фурье.&lt;br /&gt;
&lt;br /&gt;
Для восстановления исходного сигнала по его спектрограмме может быть использован алгоритм Гриффина-Лима&amp;lt;ref name=&amp;quot;griffin-lim&amp;quot;&amp;gt;D. Griffin and Jae Lim, &amp;quot;Signal estimation from modified short-time Fourier transform,&amp;quot; ICASSP '83. IEEE International Conference on Acoustics, Speech, and Signal Processing, Boston, Massachusetts, USA, 1983, pp. 804-807, doi: 10.1109/ICASSP.1983.1172092.&amp;lt;/ref&amp;gt;, который основан на минимизации среднеквадратической ошибки между оконным преобразованием Фурье оцениваемого сигнала и имеющимся преобразованием в спектрограмме.&lt;br /&gt;
&lt;br /&gt;
== Классы подходов к синтезу речи ==&lt;br /&gt;
Основными требованиями к технологиям синтеза речи являются естественность (англ. naturalness) и разборчивость (англ. intelligibility).&lt;br /&gt;
Естественность описывает, насколько генерируемая речь близка к человеческой, а разборчивость отражает, насколько сложно понять речь.&lt;br /&gt;
Идеальный синтезатор речи генерирует одновременно и натуральную, и разборчивую речь.&lt;br /&gt;
=== Конкатенативный синтез ===&lt;br /&gt;
'''Конкатенативный синтез''' (англ. concatenative synthesis) основывается на конкатенации предварительно записанных примеров человеческой речи в единую звуковую последовательность. Данный подход синтезирует наиболее естественную речь, но генерируемая речь часто содержит значительные отличия и ошибки по сравнению с человеческой речью. Примеры конкатенативного синтеза:&lt;br /&gt;
&lt;br /&gt;
* '''Синтез с выбором''' (англ. unit selection synthesis) является самым используемым подходом конкатенативного синтеза и использует большую базу данных записанной речи. При создании базы данных записанные фразы могут делиться на различные звуковые единицы, такие, как фоны, дифоны, полуфоны, слоги, морфемы, целые фразы или предложения. При запуске алгоритм генерирует выходную звуковую волну с помощью выбора наилучшей последовательности звуковых единиц из базы данных. Данный выбор обычно реализован с помощью [[Дерево решений и случайный лес|дерева решений]]. Синтез с выбором обеспечивает наиболее естественную речь, так как использует минимальную цифровую обработку сигналов. Недостатком подхода является необходимость в довольно большой базе данных звуков для достижения наибольшей естественности речи. Данный подход являлся самым популярным для общего класса задач синтеза речи, но в последнее время уступает по популярности параметрическому подходу. Примером использования синтеза с выбором является голосовой помощник Siri от Apple &amp;lt;ref name=&amp;quot;apple&amp;quot;&amp;gt;[https://machinelearning.apple.com/research/siri-voices/ Deep Learning for Siri’s Voice: On-device Deep Mixture Density Networks for Hybrid Unit Selection Synthesis.]&amp;lt;/ref&amp;gt; и голосовой помощник Алиса от компании Яндекс &amp;lt;ref&amp;gt;[https://www.seonews.ru/analytics/optimization-2018-chto-nakhoditsya-pod-kapotom-u-alisy/ Optimization 2018: что находится «под капотом» у Алисы.]&amp;lt;/ref&amp;gt;. Несмотря на то, что эти продукты используют глубокое обучение, их механизм синтеза речи основан на записанных примерах голоса.&lt;br /&gt;
&lt;br /&gt;
* '''Дифонный синтез''' (англ. diphone synthesis) является частным случаем синтеза с выбором, который использует в качестве звуковых единиц дифоны (переход от звука к звуку). Подход использует только один образец каждого дифона. База данных дифонов при этом получается сравнительно небольшой. Например, немецкий язык содержит около 800 дифонов, а испанский {{---}} около 2500. При работе алгоритма просодия входной последовательности накладывается на дифоны в базе данных с помощью различных алгоритмов цифровой обработки сигналов. Данный алгоритм значительно уступает по качеству другим подходам и, кроме меньшего размера базы данных, не дает весомых преимуществ, из-за чего не снискал большой популярности.&lt;br /&gt;
&lt;br /&gt;
* '''Синтез речи, ограниченный предметной областью''' (англ. domain-specific speech synthesis) также является частным случаем синтеза с выбором и использует базу данных предварительно записанных слов, фраз и предложений для составления выходной последовательности. Он используется в задачах, где вариативность и размер используемых фраз ограничены некоторой предметной областью, например, прогнозирование погоды или составление расписания транспорта. Из-за значительной простоты реализации и использования данный подход уже долго применяется в коммерческих продуктах, например, говорящие часы или калькуляторы. При этом данный подход может обеспечивать высокую естественность речи вследствие ограниченности используемой базы данных. Недостатками таких систем является ограниченность областью применимости и неспособность учитывать контекст речи, что может вызывать ощутимые ошибки в некоторых языках.&lt;br /&gt;
&lt;br /&gt;
=== Параметрический синтез ===&lt;br /&gt;
Параметрический синтез (англ. statistical parametrical synthesis) для генерации выходной звуковой волны, в отличии от конкатенативного синтеза, не использует реальные примеры речи, а строит вероятностное распределение некоторых параметров и акустических свойств звуковой волны.&lt;br /&gt;
В начале работы параметрического синтезатора с помощью вокодера извлекаются параметры&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{o} = \{o_1, \dots, o_N\}&amp;lt;/math&amp;gt; дискретизированной звуковой волны &amp;lt;math&amp;gt;\textbf{x} = \{x_1, \dots, x_T\}, -1 &amp;lt; x_i &amp;lt; 1&amp;lt;/math&amp;gt; и лингвистические данные &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; из текста &amp;lt;math&amp;gt;W&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;&lt;br /&gt;
соответствуют параметрам вокодера и количеству сигналов звуковой волны. Затем, генеративная модель, например, [[Марковская цепь|скрытая марковская цепь]],&lt;br /&gt;
[[Нейронные сети, перцептрон#Сети прямого распространения|нейронная сеть прямого распространения]] или [[Рекуррентные нейронные сети|рекуррентная нейронная сеть]], обучается по выделенным параметрам &amp;lt;math&amp;gt;\textbf{o}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;, получая&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{\Lambda} = \arg\max\limits_{\Lambda}p(\textbf{o} | l, \Lambda)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{\Lambda}&amp;lt;/math&amp;gt; {{---}} параметры модели. На этапе синтеза, модель генерирует наиболее правдоподобные параметры вокодера&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{\textbf{o}} = \arg\max\limits_{\textbf{o}}p(\textbf{o} | l, \hat{\Lambda})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходная звуковая волна моделируется с помощью вокодера и параметров &amp;lt;math&amp;gt;\hat{\textbf{o}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данный подход является самым популярным на сегодняшний момент, в том числе из-за того, что он позволяет использовать подходы, основанные на нейронных сетях. Современными продуктами, использующие основанный на глубоком обучении параметрический синтез являются Amazon Lex и Alexa &amp;lt;ref&amp;gt;[https://www.allthingsdistributed.com/2016/11/amazon-ai-and-alexa-for-all-aws-apps.html Bringing the Magic of Amazon AI and Alexa to Apps on AWS.] &amp;lt;/ref&amp;gt;, Google Ассистент &amp;lt;ref name=&amp;quot;cnet wavenet&amp;quot;&amp;gt;Martin, Taylor (May 9, 2018).[https://www.cnet.com/how-to/how-to-get-all-google-assistants-new-voices-right-now/  &amp;quot;Try the all-new Google Assistant voices right now&amp;quot;]. CNET.&amp;lt;/ref&amp;gt; и умные дисплеи Portal от Facebook &amp;lt;ref&amp;gt;[https://venturebeat.com/2020/05/15/facebooks-voice-synthesis-ai-generates-speech-in-500-milliseconds/ Facebook’s voice synthesis AI generates speech in 500 milliseconds.]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
== Алгоритмы, основанные на нейронных сетях ==&lt;br /&gt;
=== WaveNet ===&lt;br /&gt;
WaveNet&amp;lt;ref name=&amp;quot;wavenet&amp;quot;&amp;gt;Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&amp;lt;/ref&amp;gt; является [[Порождающие модели | порождающей моделью]], использующей параметрический подход к синтезу речи. Её задача {{---}} восстановить распределение вероятностей звукового сигнала&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{x} = \{x_1, x_2, \dots, x_T\}&amp;lt;/math&amp;gt; с помощью произведения условных вероятностей:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\textbf{x})=\prod\limits_{t=1}^{T} p(x_t | x_1, x_2, \dots, x_{t-1})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, вероятность каждого сигнала &amp;lt;math&amp;gt;x_t&amp;lt;/math&amp;gt; зависит от вероятностей предыдущих сигналов. При этом, в качестве вокодера используется [[Синтез речи#Генерация звуковой волны | мю-закон]].&lt;br /&gt;
Модель представляет собой множество слоев сверточной нейронной сети, аналогично модели [[PixelRNN_и_PixelCNN | PixelCNN]].&lt;br /&gt;
Сеть не содержит уровней [[Сверточные нейронные сети#Пулинговый слой | пулинга]] и выходной вектор имеет размерность, равную размерности входного вектора.&lt;br /&gt;
Выходом модели является категориальное распределение вероятности, получаемое с помощью softmax-преобразования.&lt;br /&gt;
&lt;br /&gt;
Основной идеей модели является использование причинных сверточных сетей (англ. causal convolution layers) и [[Сверточные нейронные сети#Расширенная свертка (aнгл. Dilated convolution) | расширенных ]] причинных сверточных сетей (англю dilated causal convolution layers).&lt;br /&gt;
Причинная сверточная сеть представляет собой несколько уровней сверточной нейронной сети, связанных между собой в порядке, который не нарушает последовательность&lt;br /&gt;
входного сигнала, т.е. оцениваемая в момент времени &amp;lt;math&amp;gt;t+1&amp;lt;/math&amp;gt; вероятность сигнала &amp;lt;math&amp;gt;p(x_{t+1} | x_1, x_2, \dots, x_t)&amp;lt;/math&amp;gt; не зависит от сигналов&lt;br /&gt;
в последующие моменты времени &amp;lt;math&amp;gt;t+2, t+3, \dots, T&amp;lt;/math&amp;gt;. Во время обучения сети сигналы из обучающих данных подаются на вход сети одновременно. На этапе генерации&lt;br /&gt;
сигналы на вход модели подаются последовательно: каждый сгенерированный моделью сигнал подается обратно на вход для генерации последующего. Причинные сверточные сети обучаются&lt;br /&gt;
быстрее, чем [[Рекуррентные нейронные сети | рекуррентные нейронные сети]], но требуют достаточно большого количества уровней для обеспечивания большого окна восприятия сигнала (англ. signal reception window) {{---}} количество предыдущих сигналов, от которых зависит оценка сигнала в текущий момент.&lt;br /&gt;
&lt;br /&gt;
[[Файл:dilated-causal-convolutions.png|thumb|300px| Рисунок 1 —  строение причинной сверточной сети (сверху) и расширенной причинной сверточной сети (снизу)&amp;lt;ref name=&amp;quot;wavenet&amp;quot;&amp;gt;Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
Модификация причинных сверточных сетей, называемая расширенные причинные сверточные сети, способна увеличить окно восприятия сигнала в разы и является основной идеей модели WaveNet.&lt;br /&gt;
Модификация заключается в применении свертки к области размерности большей, чем её длина, пропуская входные связи с некоторым шагом. Данный подход аналогичен применению пулинга или свертки с шагом большим единицы, но выходом расширенной причинной сверточной сети является последовательность размерности, равной размерности входной последовательности. Расширенные причинные сверточные сети способны достигать большего окна&lt;br /&gt;
восприятия сигнала, используя меньшее количество уровней, при этом сохраняя вычислительную сложность причинных сверточных сетей. Структура причинных сверточных сетей изображена на Рисунке 1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:wavenet.png|thumb|300px| Рисунок 2 —  строение модели WaveNet &amp;lt;ref name=&amp;quot;wavenet&amp;quot;&amp;gt;Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
Полная структура модели WaveNet изображена на Рисунке 2. Модель на вход принимает закодированную мю-законом последовательность сигналов &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; и, опционально, некоторую дополнительную информацию, обозначаемую как вектор параметров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, а на выходе возвращает распределение вероятностей для параметров мю-закона, по которым можно восстановить сигнал. В случае использования модели для генерации речи по тексту, вектор &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; может содержать информацию о рассматриваемом тексте. Сама модель представляет собой набор из &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; [[Сверточные нейронные сети#Residual block | блоков с остаточной связью]], содержащих преобразование расширенной причинной свертки и функцию активации.&lt;br /&gt;
&lt;br /&gt;
Функция активации при этом аналогична функции, предложенной в модели Gated PixelCNN &amp;lt;ref&amp;gt;Aaron van den Oord, Nal Kalchbrenner, Oriol Vinyals, Lasse Espeholt, Alex Graves, &amp;amp; Koray Kavukcuoglu. (2016). Conditional Image Generation with PixelCNN Decoders. [https://arxiv.org/abs/1606.05328/ arXiv:1606.05328]&lt;br /&gt;
&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{y} = \tanh(W_{f, k} * \textbf{x}) \odot \sigma(W_{g,k}*\textbf{x})&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; {{---}} номер слоя модели, &amp;lt;math&amp;gt;f, g&amp;lt;/math&amp;gt; {{---}} индексы входов преобразования, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; {{---}} функция сигмоиды, &amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt; {{---}} операция свертки, &amp;lt;math&amp;gt;\odot&amp;lt;/math&amp;gt; {{---}} операция покомпонентного умножения векторов и &amp;lt;math&amp;gt;W&amp;lt;/math&amp;gt; {{---}} выученные параметры свертки.&lt;br /&gt;
&lt;br /&gt;
В случае использования дополнительной информации &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; модель оценивает распределение вероятностей звукового сигнала как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\textbf{x}|\textbf{h})=\prod\limits_{t=1}^{T} p(x_t | x_1, x_2, \dots, x_{t-1}, \textbf{h})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для использования дополнительной информации &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt; функция активации может использовать вектор &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt; глобально при вычислении каждой свертки как&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{y} = \tanh(W_{f, k} * \textbf{x} + V_{f,k}^T\textbf{h}) \odot \sigma(W_{g,k}*\textbf{x}+V_{g,k}^T\textbf{h})&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;V_{f,k}&amp;lt;/math&amp;gt; {{---}} выученные параметры линейной проекции. В случае, когда размерность вектора &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt; меньше, чем размерность &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt;, можно использовать upsampling-преобразование сверточных сетей, чтобы получить вектор размерности, равной &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt;, и использовать его вместо оригинального вектора &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt;. При этом &amp;lt;math&amp;gt;V_{f,k}*\textbf{h}&amp;lt;/math&amp;gt; будет являться операцией свертки размера 1.&lt;br /&gt;
&lt;br /&gt;
Самый известный пример применения WaveNet для синтеза речи является  технология Google Ассистент, которая использует WaveNet для генерации голосов ассистентов на различных&lt;br /&gt;
языках. Модель позволила значительно сократить количество записей речи актеров озвучки, требуемых для создания голосовой модели&amp;lt;ref name=&amp;quot;cnet wavenet&amp;quot;&amp;gt;Martin, Taylor (May 9, 2018).[https://www.cnet.com/how-to/how-to-get-all-google-assistants-new-voices-right-now/  &amp;quot;Try the all-new Google Assistant voices right now&amp;quot;]. CNET.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
=== Tacotron ===&lt;br /&gt;
[[Файл:Tacotron.PNG|thumb|300px| Рисунок 3 — строение модели Tacotron&amp;lt;ref name=&amp;quot;tacotron&amp;quot;&amp;gt;Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
[[Файл:Tacotron-cbhg.PNG|thumb|300px| Рисунок 4 —строение модуля CBHG модели Tacotron&amp;lt;ref name=&amp;quot;tacotron&amp;quot;&amp;gt;Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
Tacotron {{---}} модель&amp;lt;ref name=&amp;quot;tacotron&amp;quot;&amp;gt;Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&amp;lt;/ref&amp;gt; параметрического синтеза речи, основанная на подходе [[Механизм внимания | seq2seq]], разработанная Google и опубликованная в 2017 году. Модель состоит из кодера, декодера с [[Механизм внимания | вниманием]] и нейронной сети для&lt;br /&gt;
пост-процессинга сигнала. Схема модели изображена на Рисунке 2.&lt;br /&gt;
&lt;br /&gt;
Кодер и сеть пост-процессинга опираются на блок CBHG, схема которого изображена на Рисунке 3. Блок состоит из набора одномерных сверточных фильтров, за которыми следуют&lt;br /&gt;
шоссейные нейронные сети (англ. highway networks)&amp;lt;ref&amp;gt;Rupesh Kumar Srivastava, Klaus Greff, and J ̈urgen Schmidhuber. Highway networks. [https://arxiv.org/abs/1505.00387/ arXiv:1505.00387], 2015.&amp;lt;/ref&amp;gt;, являющиеся модификацией [[Долгая краткосрочная память | LSTM сетей]], и двунаправленный [[Долгая краткосрочная память#Управляемые рекуррентные нейроны | управляемый рекуррентный блок]]. Входная последовательность сначала обрабатывается &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;&lt;br /&gt;
наборами сверточных фильтров с размерностью &amp;lt;math&amp;gt;1, 2, \dots, K&amp;lt;/math&amp;gt;. Эти фильтры моделируют локальную и контекстно-зависимую информацию (по аналогии с моделированием униграмм,&lt;br /&gt;
биграмм, вплоть до &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;-грамм). Выход сверточного уровня далее обрабатывается шоссейной сетью для дальнейшего выделения параметров. В конце CBHG&lt;br /&gt;
используется управляемый рекуррентный блок, который для выделения параметров опирается на контекст перед рассматриваемым символом и после рассматриваемого символа.&lt;br /&gt;
&lt;br /&gt;
Задача кодера заключается в извлечении последовательных параметров из текста. Его входом является последовательность символов, в которой каждый символ был закодирован one-hot&lt;br /&gt;
кодированием и объединен в единый непрерывный вектор. К данному входу применяется ряд нелинейных преобразований в виде сети с бутылочным горлышком (англ. bottleneck layer), что позволяет улучшить&lt;br /&gt;
обобщаемость сети и ускорить сходимость. Модуль CBHG преобразует выход нелинейных преобразований в итоговое представление текста, которая передается в декодер.&lt;br /&gt;
&lt;br /&gt;
Декодер является рекуррентной нейронной сетью с вниманием, в которой запрос внимания генерируется каждый временной промежуток. Вектор контекста соединяется с выходом ячейки внимания&lt;br /&gt;
и подается на вход декодирующим рекуррентным нейронным сетям, которые являются управляемыми рекуррентными блоками. Выходом декодера является спектрограмма звуковой волны, которая&lt;br /&gt;
передается сети пост-обработки для генерации непосредственно звуковой волны.&lt;br /&gt;
&lt;br /&gt;
В качестве сети пост-обработки используется модуль CBHG, описанный ранее. После этого спектрограмма звуковой волны передается на вход [[Синтез речи#Генерация звуковой волны | алгоритму Гриффина-Лима]], который генерирует итоговую звуковую волну.&lt;br /&gt;
&lt;br /&gt;
Модель Tacotron была значительно улучшена в последующей модификации Tacotron 2 &amp;lt;ref&amp;gt;Jonathan Shen, Ruoming Pang, Ron J. Weiss, Mike Schuster, Navdeep Jaitly, Zongheng Yang, Zhifeng Chen, Yu Zhang, Yuxuan Wang, RJ Skerry-Ryan, Rif A. Saurous, Yannis Agiomyrgiannakis, &amp;amp; Yonghui Wu. (2018). Natural TTS Synthesis by Conditioning WaveNet on Mel Spectrogram Predictions. [https://arxiv.org/abs/1712.05884  arXiv:1712.05884].&amp;lt;/ref&amp;gt;, которая переработала исходную архитектуру Tacotron и объединила её с вокодером на основе WaveNet. Данная модель способна синтезировать речь высокого качества, принимая на вход только текст, который необходимо озвучить&amp;lt;ref&amp;gt;[https://ai.googleblog.com/2017/12/tacotron-2-generating-human-like-speech.html/ Tacotron 2: Generating Human-like Speech from Text]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Проблемы ==&lt;br /&gt;
=== Задача обработки текста === &lt;br /&gt;
Алгоритмы обработки текста могут не справляться с обработкой определенных частей речи, таких, как аббревиатуры, числа и гетеронимы. Произношение определенных слов также зависит от контекста их применения. Большинство систем синтеза речи по тексту не способны выделять контекст предложений и используют различные эвристические подходы с целью различить омографы (слова с одинаковым написанием, но различным произношением).&lt;br /&gt;
=== Преобразование текста в фонемы ===&lt;br /&gt;
Процесс преобразования текста в фонемы обычно подразделяется на два подхода {{---}} словарный и основанный на правилах. Словарный подход использует словарь с записанными фонетическими представлениями слов и в процессе работы производит поиск в нем с целью конвертации слова в последовательность фонем. Основанный на правилах подход использует набор правил, которые применяются к словам или частям слов с целью выделения фонем. Оба эти подхода имеют существенные недостатки и требуют усовершенствования.&lt;br /&gt;
=== Оценка качества ===&lt;br /&gt;
На данный момент не существует единых критериев оценки качества синтезаторов речи. В каждом отдельном применении технологии синтеза речи могут быть в том числе свои критерии качества, связанные с предметной областью или используемым оборудованием. С другой стороны, ряд исследователей начали оценивать синтезаторы речи используя распространенные наборы данных для синтеза речи &amp;lt;ref&amp;gt;[http://festvox.org/blizzard/ Blizzard Challenge]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
== См. также ==&lt;br /&gt;
&lt;br /&gt;
* [[Нейронные сети, перцептрон ]]&lt;br /&gt;
* [[Сверточные нейронные сети ]]&lt;br /&gt;
* [[ Рекуррентные нейронные сети ]]&lt;br /&gt;
* [[ Механизм внимания ]]&lt;br /&gt;
* [[ Распознавание речи ]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&lt;br /&gt;
* Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B8%D0%BD%D1%82%D0%B5%D0%B7_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=78600</id>
		<title>Синтез речи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B8%D0%BD%D1%82%D0%B5%D0%B7_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=78600"/>
				<updated>2021-01-15T15:54:05Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: Мелкие исправления, добавлен параграф про Tacotron 2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}[[Категория:Машинное обучение]]&lt;br /&gt;
'''Синтез речи''' (англ. speech synthesis) {{---}} процесс генерации компьютером человеческой речи. Компьютерная система, способная к синтезу речи, называется речевым синтезатором.&lt;br /&gt;
Система, генерирующая человеческую речь, основываясь на тексте, называется '''text-to-speech''' системой (сокр. TTS).&lt;br /&gt;
&lt;br /&gt;
В процессе человеческой речи нервная система транслирует некоторый текст или мысленный концепт в движение мышц, связанных с органами дыхания и речи. Затем производится генерация акустического сигнала с помощью потока воздуха из легких. Сигнал содержит как периодические компоненты (созданные с помощью вибрации органов речи), так и апериодические&lt;br /&gt;
(созданные окружающей средой и фоновым шумом). Используя изменяющиеся во времени сокращения мышц, меняются частотные характеристики акустического сигнала.&lt;br /&gt;
Задача систем генерации речи по тексту {{---}} симулировать данный процесс в каком-либо виде.&lt;br /&gt;
&lt;br /&gt;
== Этапы синтеза речи ==&lt;br /&gt;
Работу систем синтеза речи по тексту, как правило, можно разделить на два этапа, за которые отвечают два отдельных компонента {{---}} обработка текста и синтез речи.&lt;br /&gt;
&lt;br /&gt;
Первый этап обычно содержит несколько этапов [[Обработка естественного языка|обработки естественного языка]], такие, как разбиение  на предложения, разбиение на слова, нормализация текста,&lt;br /&gt;
автоматическая морфологическая разметка и конвертация графем в фонемы (англ. grapheme-to-phoneme conversion, G2P).&lt;br /&gt;
Данный этап принимает в качестве входных параметров текст и возвращает последовательность фонем с различными выделенными лингвистическими особенностями.&lt;br /&gt;
&lt;br /&gt;
Этап синтеза речи, в свою очередь, принимает на вход последовательность фонем и возвращает синтезированную звуковую волну речи.&lt;br /&gt;
Данный этап обычно включает в себя алгоритмы предсказания [https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%81%D0%BE%D0%B4%D0%B8%D1%8F_(%D0%BB%D0%B8%D0%BD%D0%B3%D0%B2%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0)/ просодии] - характеристик речи, описывающих признаки, являющиеся дополнительными к основной артикуляции звука, такие, как тон, ударение, громкость и т.д. &lt;br /&gt;
&lt;br /&gt;
== Генерация звуковой волны ==&lt;br /&gt;
&lt;br /&gt;
Обычно, синтезаторы речи не работают непосредственно с сигналом звуковой волны, а использует некоторое представление этого сигнала, например, спектрограмму. Алгоритм, способный выделить такие параметры и по ним обратно восстановить звуковую волну, называется '''вокодер''' (англ. voice encoder). Примерами таких алгоритмов являются мю-закон &amp;lt;ref name=&amp;quot;mu law&amp;quot;&amp;gt;[http://www.itu.int/rec/dologin_pub.asp?lang=e&amp;amp;id=T-REC-G.711-198811-I!!PDF-E&amp;amp;type=items/ &amp;quot;ITU-T Recommendation G.711&amp;quot;]&amp;lt;/ref&amp;gt; и восстановление сигнала по его спектрограмме. &lt;br /&gt;
&lt;br /&gt;
Мю-закон преобразует каждое значение дискретизированного сигнала &amp;lt;math&amp;gt;\textbf{x} = \{x_1, x_2, \dots, x_T\}&amp;lt;/math&amp;gt;  как&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(x_t) = sign(x_t) \frac{\ln(1+\mu|x_t|)}{\ln(1+\mu)}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\mu = 255&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1 &amp;lt; x_t &amp;lt; 1&amp;lt;/math&amp;gt;, а затем кодирует сигнал как двузначное шестнадцатеричное число, которое обозначает некоторый интервал на числовой прямой&amp;lt;ref name=&amp;quot;mu law&amp;quot;&amp;gt;[http://www.itu.int/rec/dologin_pub.asp?lang=e&amp;amp;id=T-REC-G.711-198811-I!!PDF-E&amp;amp;type=items/ &amp;quot;ITU-T Recommendation G.711&amp;quot;]&amp;lt;/ref&amp;gt;. Обратное преобразование выбирает значение преобразованного сигнала &amp;lt;math&amp;gt;y_t=f(x_t)&amp;lt;/math&amp;gt; из данного номера интервала и получает оценку исходного сигнала &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; f^{-1}(y_t) = sign(y_t)(1/\mu)((1+\mu)^{|y_t|}-1), -1 &amp;lt; y_t &amp;lt; 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В качестве представления звукового сигнала может выступать [https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0/ спектрограмма волны] - изображение, показывающее зависимость спектральной плотности мощности сигнала от времени. Спектрограммы отображают частоту и амплитуду сигнала во времени, но не содержат никакой информации о фазе сигнала, из-за чего результат обратного восстановления сигнала по спектрограмме неизбежно отличается от оригинала. Цифровая генерация спектрограммы сигнала &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; сводится к вычислению квадрата амплитуды [https://ru.wikipedia.org/wiki/%D0%9E%D0%BA%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5/ оконного преобразования Фурье]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;spectrogram(t, w) = |STFT(t, w)|^2&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; {{---}} используемое окно и &amp;lt;math&amp;gt;STFT(t, w)&amp;lt;/math&amp;gt; {{---}} оконное преобразование Фурье.&lt;br /&gt;
&lt;br /&gt;
Для восстановления исходного сигнала по его спектрограмме может быть использован алгоритм Гриффина-Лима&amp;lt;ref name=&amp;quot;griffin-lim&amp;quot;&amp;gt;D. Griffin and Jae Lim, &amp;quot;Signal estimation from modified short-time Fourier transform,&amp;quot; ICASSP '83. IEEE International Conference on Acoustics, Speech, and Signal Processing, Boston, Massachusetts, USA, 1983, pp. 804-807, doi: 10.1109/ICASSP.1983.1172092.&amp;lt;/ref&amp;gt;, который основан на минимизации среднеквадратической ошибки между оконным преобразованием Фурье оцениваемого сигнала и имеющимся преобразованием в спектрограмме.&lt;br /&gt;
&lt;br /&gt;
== Классы подходов к синтезу речи ==&lt;br /&gt;
Основными требованиями к технологиям синтеза речи являются естественность (англ. naturalness) и разборчивость (англ. intelligibility).&lt;br /&gt;
Естественность описывает, насколько генерируемая речь близка к человеческой, а разборчивость отражает, насколько сложно понять речь.&lt;br /&gt;
Идеальный синтезатор речи генерирует одновременно и натуральную, и разборчивую речь.&lt;br /&gt;
=== Конкатенативный синтез ===&lt;br /&gt;
'''Конкатенативный синтез''' (англ. concatenative synthesis) основывается на конкатенации предварительно записанных примеров человеческой речи в единую звуковую последовательность. Данный подход синтезирует наиболее естественную речь, но генерируемая речь часто содержит значительные отличия и ошибки по сравнению с человеческой речью. Примеры конкатенативного синтеза:&lt;br /&gt;
&lt;br /&gt;
* '''Синтез с выбором''' (англ. unit selection synthesis) является самым используемым подходом конкатенативного синтеза и использует большую базу данных записанной речи. При создании базы данных записанные фразы могут делиться на различные звуковые единицы, такие, как фоны, дифоны, полуфоны, слоги, морфемы, целые фразы или предложения. При запуске алгоритм генерирует выходную звуковую волну с помощью выбора наилучшей последовательности звуковых единиц из базы данных. Данный выбор обычно реализован с помощью [[Дерево решений и случайный лес|дерева решений]]. Синтез с выбором обеспечивает наиболее естественную речь, так как использует минимальную цифровую обработку сигналов. Недостатком подхода является необходимость в довольно большой базе данных звуков для достижения наибольшей естественности речи. Данный подход являлся самым популярным для общего класса задач синтеза речи, но в последнее время уступает по популярности параметрическому подходу. Примером использования синтеза с выбором является голосовой помощник Siri от Apple &amp;lt;ref name=&amp;quot;apple&amp;quot;&amp;gt;[https://machinelearning.apple.com/research/siri-voices/ Deep Learning for Siri’s Voice: On-device Deep Mixture Density Networks for Hybrid Unit Selection Synthesis.]&amp;lt;/ref&amp;gt; и голосовой помощник Алиса от компании Яндекс &amp;lt;ref&amp;gt;[https://www.seonews.ru/analytics/optimization-2018-chto-nakhoditsya-pod-kapotom-u-alisy/ Optimization 2018: что находится «под капотом» у Алисы.]&amp;lt;/ref&amp;gt;. Несмотря на то, что эти продукты используют глубокое обучение, их механизм синтеза речи основан на записанных примерах голоса.&lt;br /&gt;
&lt;br /&gt;
* '''Дифонный синтез''' (англ. diphone synthesis) является частным случаем синтеза с выбором, который использует в качестве звуковых единиц дифоны (переход от звука к звуку). Подход использует только один образец каждого дифона. База данных дифонов при этом получается сравнительно небольшой. Например, немецкий язык содержит около 800 дифонов, а испанский {{---}} около 2500. При работе алгоритма просодия входной последовательности накладывается на дифоны в базе данных с помощью различных алгоритмов цифровой обработки сигналов. Данный алгоритм значительно уступает по качеству другим подходам и, кроме меньшего размера базы данных, не дает весомых преимуществ, из-за чего не снискал большой популярности.&lt;br /&gt;
&lt;br /&gt;
* '''Синтез речи, ограниченный предметной областью''' (англ. domain-specific speech synthesis) также является частным случаем синтеза с выбором и использует базу данных предварительно записанных слов, фраз и предложений для составления выходной последовательности. Он используется в задачах, где вариативность и размер используемых фраз ограничены некоторой предметной областью, например, прогнозирование погоды или составление расписания транспорта. Из-за значительной простоты реализации и использования данный подход уже долго применяется в коммерческих продуктах, например, говорящие часы или калькуляторы. При этом данный подход может обеспечивать высокую естественность речи вследствие ограниченности используемой базы данных. Недостатками таких систем является ограниченность областью применимости и неспособность учитывать контекст речи, что может вызывать ощутимые ошибки в некоторых языках.&lt;br /&gt;
&lt;br /&gt;
=== Параметрический синтез ===&lt;br /&gt;
Параметрический синтез (англ. statistical parametrical synthesis) для генерации выходной звуковой волны, в отличии от конкатенативного синтеза, не использует реальные примеры речи, а строит вероятностное распределение некоторых параметров и акустических свойств звуковой волны.&lt;br /&gt;
В начале работы параметрического синтезатора с помощью вокодера извлекаются параметры&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{o} = \{o_1, \dots, o_N\}&amp;lt;/math&amp;gt; дискретизированной звуковой волны &amp;lt;math&amp;gt;\textbf{x} = \{x_1, \dots, x_T\}, -1 &amp;lt; x_i &amp;lt; 1&amp;lt;/math&amp;gt; и лингвистические данные &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; из текста &amp;lt;math&amp;gt;W&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;&lt;br /&gt;
соответствуют параметрам вокодера и количеству сигналов звуковой волны. Затем, генеративная модель, например, [[Марковская цепь|скрытая марковская цепь]],&lt;br /&gt;
[[Нейронные сети, перцептрон#Сети прямого распространения|нейронная сеть прямого распространения]] или [[Рекуррентные нейронные сети|рекуррентная нейронная сеть]], обучается по выделенным параметрам &amp;lt;math&amp;gt;\textbf{o}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;, получая&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{\Lambda} = \arg\max\limits_{\Lambda}p(\textbf{o} | l, \Lambda)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{\Lambda}&amp;lt;/math&amp;gt; {{---}} параметры модели. На этапе синтеза, модель генерирует наиболее правдоподобные параметры вокодера&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{\textbf{o}} = \arg\max\limits_{\textbf{o}}p(\textbf{o} | l, \hat{\Lambda})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходная звуковая волна моделируется с помощью вокодера и параметров &amp;lt;math&amp;gt;\hat{\textbf{o}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данный подход является самым популярным на сегодняшний момент, в том числе из-за того, что он позволяет использовать подходы, основанные на нейронных сетях. Современными продуктами, использующие основанный на глубоком обучении параметрический синтез являются Amazon Lex и Alexa &amp;lt;ref&amp;gt;[https://www.allthingsdistributed.com/2016/11/amazon-ai-and-alexa-for-all-aws-apps.html Bringing the Magic of Amazon AI and Alexa to Apps on AWS.] &amp;lt;/ref&amp;gt;, Google Ассистент &amp;lt;ref name=&amp;quot;cnet wavenet&amp;quot;&amp;gt;Martin, Taylor (May 9, 2018).[https://www.cnet.com/how-to/how-to-get-all-google-assistants-new-voices-right-now/  &amp;quot;Try the all-new Google Assistant voices right now&amp;quot;]. CNET.&amp;lt;/ref&amp;gt; и умные дисплеи Portal от Facebook &amp;lt;ref&amp;gt;[https://venturebeat.com/2020/05/15/facebooks-voice-synthesis-ai-generates-speech-in-500-milliseconds/ Facebook’s voice synthesis AI generates speech in 500 milliseconds.]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
== Алгоритмы, основанные на нейронных сетях ==&lt;br /&gt;
=== WaveNet ===&lt;br /&gt;
WaveNet&amp;lt;ref name=&amp;quot;wavenet&amp;quot;&amp;gt;Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&amp;lt;/ref&amp;gt; является [[Порождающие модели | порождающей моделью]], использующей параметрический подход к синтезу речи. Её задача {{---}} восстановить распределение вероятностей звукового сигнала&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{x} = \{x_1, x_2, \dots, x_T\}&amp;lt;/math&amp;gt; с помощью произведения условных вероятностей:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\textbf{x})=\prod\limits_{t=1}^{T} p(x_t | x_1, x_2, \dots, x_{t-1})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, вероятность каждого сигнала &amp;lt;math&amp;gt;x_t&amp;lt;/math&amp;gt; зависит от вероятностей предыдущих сигналов. При этом, в качестве вокодера используется [[Синтез речи#Генерация звуковой волны | мю-закон]].&lt;br /&gt;
Модель представляет собой множество слоев сверточной нейронной сети, аналогично модели [[PixelRNN_и_PixelCNN | PixelCNN]].&lt;br /&gt;
Сеть не содержит уровней [[Сверточные нейронные сети#Пулинговый слой | пулинга]] и выходной вектор имеет размерность, равную размерности входного вектора.&lt;br /&gt;
Выходом модели является категориальное распределение вероятности, получаемое с помощью softmax-преобразования.&lt;br /&gt;
&lt;br /&gt;
Основной идеей модели является использование причинных сверточных сетей (англ. causal convolution layers) и [[Сверточные нейронные сети#Расширенная свертка (aнгл. Dilated convolution) | расширенных ]] причинных сверточных сетей (англю dilated causal convolution layers).&lt;br /&gt;
Причинная сверточная сеть представляет собой несколько уровней сверточной нейронной сети, связанных между собой в порядке, который не нарушает последовательность&lt;br /&gt;
входного сигнала, т.е. оцениваемая в момент времени &amp;lt;math&amp;gt;t+1&amp;lt;/math&amp;gt; вероятность сигнала &amp;lt;math&amp;gt;p(x_{t+1} | x_1, x_2, \dots, x_t)&amp;lt;/math&amp;gt; не зависит от сигналов&lt;br /&gt;
в последующие моменты времени &amp;lt;math&amp;gt;t+2, t+3, \dots, T&amp;lt;/math&amp;gt;. Во время обучения сети сигналы из обучающих данных подаются на вход сети одновременно. На этапе генерации&lt;br /&gt;
сигналы на вход модели подаются последовательно: каждый сгенерированный моделью сигнал подается обратно на вход для генерации последующего. Причинные сверточные сети обучаются&lt;br /&gt;
быстрее, чем [[Рекуррентные нейронные сети | рекуррентные нейронные сети]], но требуют достаточно большого количества уровней для обеспечивания большого окна восприятия сигнала (англ. signal reception window) {{---}} количество предыдущих сигналов, от которых зависит оценка сигнала в текущий момент.&lt;br /&gt;
&lt;br /&gt;
[[Файл:dilated-causal-convolutions.png|thumb|300px| Рисунок 1 —  строение причинной сверточной сети (сверху) и расширенной причинной сверточной сети (снизу)&amp;lt;ref name=&amp;quot;wavenet&amp;quot;&amp;gt;Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
Модификация причинных сверточных сетей, называемая расширенные причинные сверточные сети, способна увеличить окно восприятия сигнала в разы и является основной идеей модели WaveNet.&lt;br /&gt;
Модификация заключается в применении свертки к области размерности большей, чем её длина, пропуская входные связи с некоторым шагом. Данный подход аналогичен применению пулинга или свертки с шагом большим единицы, но выходом расширенной причинной сверточной сети является последовательность размерности, равной размерности входной последовательности. Расширенные причинные сверточные сети способны достигать большего окна&lt;br /&gt;
восприятия сигнала, используя меньшее количество уровней, при этом сохраняя вычислительную сложность причинных сверточных сетей. Структура причинных сверточных сетей изображена на Рисунке 1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:wavenet.png|thumb|300px| Рисунок 2 —  строение модели WaveNet &amp;lt;ref name=&amp;quot;wavenet&amp;quot;&amp;gt;Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
Полная структура модели WaveNet изображена на Рисунке 2. Модель на вход принимает закодированную мю-законом последовательность сигналов &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; и, опционально, некоторую дополнительную информацию, обозначаемую как вектор параметров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, а на выходе возвращает распределение вероятностей для параметров мю-закона, по которым можно восстановить сигнал. В случае использования модели для генерации речи по тексту, вектор &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; может содержать информацию о рассматриваемом тексте. Сама модель представляет собой набор из &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; [[Сверточные нейронные сети#Residual block | блоков с остаточной связью]], содержащих преобразование расширенной причинной свертки и функцию активации.&lt;br /&gt;
&lt;br /&gt;
Функция активации при этом аналогична функции, предложенной в модели Gated PixelCNN &amp;lt;ref&amp;gt;Aaron van den Oord, Nal Kalchbrenner, Oriol Vinyals, Lasse Espeholt, Alex Graves, &amp;amp; Koray Kavukcuoglu. (2016). Conditional Image Generation with PixelCNN Decoders. [https://arxiv.org/abs/1606.05328/ arXiv:1606.05328]&lt;br /&gt;
&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{y} = \tanh(W_{f, k} * \textbf{x}) \odot \sigma(W_{g,k}*\textbf{x})&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; {{---}} номер слоя модели, &amp;lt;math&amp;gt;f, g&amp;lt;/math&amp;gt; {{---}} индексы входов преобразования, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; {{---}} функция сигмоиды, &amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt; {{---}} операция свертки, &amp;lt;math&amp;gt;\odot&amp;lt;/math&amp;gt; {{---}} операция покомпонентного умножения векторов и &amp;lt;math&amp;gt;W&amp;lt;/math&amp;gt; {{---}} выученные параметры свертки.&lt;br /&gt;
&lt;br /&gt;
В случае использования дополнительной информации &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; модель оценивает распределение вероятностей звукового сигнала как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\textbf{x}|\textbf{h})=\prod\limits_{t=1}^{T} p(x_t | x_1, x_2, \dots, x_{t-1}, \textbf{h})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для использования дополнительной информации &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt; функция активации может использовать вектор &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt; глобально при вычислении каждой свертки как&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{y} = \tanh(W_{f, k} * \textbf{x} + V_{f,k}^T\textbf{h}) \odot \sigma(W_{g,k}*\textbf{x}+V_{g,k}^T\textbf{h})&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;V_{f,k}&amp;lt;/math&amp;gt; {{---}} выученные параметры линейной проекции. В случае, когда размерность вектора &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt; меньше, чем размерность &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt;, можно использовать upsampling-преобразование сверточных сетей, чтобы получить вектор размерности, равной &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt;, и использовать его вместо оригинального вектора &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt;. При этом &amp;lt;math&amp;gt;V_{f,k}*\textbf{h}&amp;lt;/math&amp;gt; будет являться операцией свертки размера 1.&lt;br /&gt;
&lt;br /&gt;
Самый известный пример применения WaveNet для синтеза речи является  технология Google Ассистент, которая использует WaveNet для генерации голосов ассистентов на различных&lt;br /&gt;
языках. Модель позволила значительно сократить количество записей речи актеров озвучки, требуемых для создания голосовой модели&amp;lt;ref name=&amp;quot;cnet wavenet&amp;quot;&amp;gt;Martin, Taylor (May 9, 2018).[https://www.cnet.com/how-to/how-to-get-all-google-assistants-new-voices-right-now/  &amp;quot;Try the all-new Google Assistant voices right now&amp;quot;]. CNET.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
=== Tacotron ===&lt;br /&gt;
[[Файл:Tacotron.PNG|thumb|300px| Рисунок 3 — строение модели Tacotron&amp;lt;ref name=&amp;quot;tacotron&amp;quot;&amp;gt;Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
[[Файл:Tacotron-cbhg.PNG|thumb|300px| Рисунок 4 —строение модуля CBHG модели Tacotron&amp;lt;ref name=&amp;quot;tacotron&amp;quot;&amp;gt;Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
Tacotron {{---}} модель&amp;lt;ref name=&amp;quot;tacotron&amp;quot;&amp;gt;Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&amp;lt;/ref&amp;gt; параметрического синтеза речи, основанная на подходе [[Механизм внимания | seq2seq]], разработанная Google и опубликованная в 2017 году. Модель состоит из кодера, декодера с [[Механизм внимания | вниманием]] и нейронной сети для&lt;br /&gt;
пост-процессинга сигнала. Схема модели изображена на Рисунке 2.&lt;br /&gt;
&lt;br /&gt;
Кодер и сеть пост-процессинга опираются на блок CBHG, схема которого изображена на Рисунке 3. Блок состоит из набора одномерных сверточных фильтров, за которыми следуют&lt;br /&gt;
шоссейные нейронные сети (англ. highway networks)&amp;lt;ref&amp;gt;Rupesh Kumar Srivastava, Klaus Greff, and J ̈urgen Schmidhuber. Highway networks. [https://arxiv.org/abs/1505.00387/ arXiv:1505.00387], 2015.&amp;lt;/ref&amp;gt;, являющиеся модификацией [[Долгая краткосрочная память | LSTM сетей]], и двунаправленный [[Долгая краткосрочная память#Управляемые рекуррентные нейроны | управляемый рекуррентный блок]]. Входная последовательность сначала обрабатывается &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;&lt;br /&gt;
наборами сверточных фильтров с размерностью &amp;lt;math&amp;gt;1, 2, \dots, K&amp;lt;/math&amp;gt;. Эти фильтры моделируют локальную и контекстно-зависимую информацию (по аналогии с моделированием униграмм,&lt;br /&gt;
биграмм, вплоть до &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;-грамм). Выход сверточного уровня далее обрабатывается шоссейной сетью для дальнейшего выделения параметров. В конце CBHG&lt;br /&gt;
используется управляемый рекуррентный блок, который для выделения параметров опирается на контекст перед рассматриваемым символом и после рассматриваемого символа.&lt;br /&gt;
&lt;br /&gt;
Задача кодера заключается в извлечении последовательных параметров из текста. Его входом является последовательность символов, в которой каждый символ был закодирован one-hot&lt;br /&gt;
кодированием и объединен в единый непрерывный вектор. К данному входу применяется ряд нелинейных преобразований в виде сети с бутылочным горлышком (англ. bottleneck layer), что позволяет улучшить&lt;br /&gt;
обобщаемость сети и ускорить сходимость. Модуль CBHG преобразует выход нелинейных преобразований в итоговое представление текста, которая передается в декодер.&lt;br /&gt;
&lt;br /&gt;
Декодер является рекуррентной нейронной сетью с вниманием, в которой запрос внимания генерируется каждый временной промежуток. Вектор контекста соединяется с выходом ячейки внимания&lt;br /&gt;
и подается на вход декодирующим рекуррентным нейронным сетям, которые являются управляемыми рекуррентными блоками. Выходом декодера является спектрограмма звуковой волны, которая&lt;br /&gt;
передается сети пост-обработки для генерации непосредственно звуковой волны.&lt;br /&gt;
&lt;br /&gt;
В качестве сети пост-обработки используется модуль CBHG, описанный ранее. После этого спектрограмма звуковой волны передается на вход [[Синтез речи#Генерация звуковой волны | алгоритму Гриффина-Лима]], который генерирует итоговую звуковую волну.&lt;br /&gt;
&lt;br /&gt;
Модель Tacotron была значительно улучшена в последующей модификации Tacotron 2 &amp;lt;ref&amp;gt;Jonathan Shen, Ruoming Pang, Ron J. Weiss, Mike Schuster, Navdeep Jaitly, Zongheng Yang, Zhifeng Chen, Yu Zhang, Yuxuan Wang, RJ Skerry-Ryan, Rif A. Saurous, Yannis Agiomyrgiannakis, &amp;amp; Yonghui Wu. (2018). Natural TTS Synthesis by Conditioning WaveNet on Mel Spectrogram Predictions. [https://arxiv.org/abs/1712.05884  arXiv:1712.05884].&amp;lt;/ref&amp;gt;, которая переработала исходную архитектуру Tacotron и объединила её с вокодером на основе WaveNet. Данная модель способна синтезировать речь высокого качества, принимая на вход только текст, который необходимо озвучить&amp;lt;ref&amp;gt;[https://ai.googleblog.com/2017/12/tacotron-2-generating-human-like-speech.html &lt;br /&gt;
Tacotron 2: Generating Human-like Speech from Text]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Проблемы ==&lt;br /&gt;
=== Задача обработки текста === &lt;br /&gt;
Алгоритмы обработки текста могут не справляться с обработкой определенных частей речи, таких, как аббревиатуры, числа и гетеронимы. Произношение определенных слов также зависит от контекста их применения. Большинство систем синтеза речи по тексту не способны выделять контекст предложений и используют различные эвристические подходы с целью различить омографы (слова с одинаковым написанием, но различным произношением).&lt;br /&gt;
=== Преобразование текста в фонемы ===&lt;br /&gt;
Процесс преобразования текста в фонемы обычно подразделяется на два подхода {{---}} словарный и основанный на правилах. Словарный подход использует словарь с записанными фонетическими представлениями слов и в процессе работы производит поиск в нем с целью конвертации слова в последовательность фонем. Основанный на правилах подход использует набор правил, которые применяются к словам или частям слов с целью выделения фонем. Оба эти подхода имеют существенные недостатки и требуют усовершенствования.&lt;br /&gt;
=== Оценка качества ===&lt;br /&gt;
На данный момент не существует единых критериев оценки качества синтезаторов речи. В каждом отдельном применении технологии синтеза речи могут быть в том числе свои критерии качества, связанные с предметной областью или используемым оборудованием. С другой стороны, ряд исследователей начали оценивать синтезаторы речи используя распространенные наборы данных для синтеза речи &amp;lt;ref&amp;gt;[http://festvox.org/blizzard/ Blizzard Challenge]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
== См. также ==&lt;br /&gt;
&lt;br /&gt;
* [[Нейронные сети, перцептрон ]]&lt;br /&gt;
* [[Сверточные нейронные сети ]]&lt;br /&gt;
* [[ Рекуррентные нейронные сети ]]&lt;br /&gt;
* [[ Механизм внимания ]]&lt;br /&gt;
* [[ Распознавание речи ]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&lt;br /&gt;
* Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B8%D0%BD%D1%82%D0%B5%D0%B7_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=78594</id>
		<title>Синтез речи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B8%D0%BD%D1%82%D0%B5%D0%B7_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=78594"/>
				<updated>2021-01-15T14:04:28Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: Добавлены примеры&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}[[Категория:Машинное обучение]]&lt;br /&gt;
'''Синтез речи''' (англ. speech synthesis) {{---}} процесс генерации компьютером человеческой речи. Компьютерная система, способная к синтезу речи, называется речевым синтезатором.&lt;br /&gt;
Система, генерирующая человеческую речь, основываясь на тексте, называется '''text-to-speech''' системой (сокр. TTS).&lt;br /&gt;
&lt;br /&gt;
В процессе человеческой речи нервная система транслирует некоторый текст или мысленный концепт в движение мышц, связанных с органами дыхания и речи. Затем производится генерация акустического сигнала с помощью потока воздуха из легких. Сигнал содержит как периодические компоненты (созданные с помощью вибрации органов речи), так и апериодические&lt;br /&gt;
(созданные окружающей средой и фоновым шумом). Используя изменяющиеся во времени сокращения мышц, меняются частотные характеристики акустического сигнала.&lt;br /&gt;
Задача систем генерации речи по тексту {{---}} симулировать данный процесс в каком-либо виде.&lt;br /&gt;
&lt;br /&gt;
== Этапы синтеза речи ==&lt;br /&gt;
Работу систем синтеза речи по тексту, как правило, можно разделить на два этапа, за которые отвечают два отдельных компонента {{---}} обработка текста и синтез речи.&lt;br /&gt;
&lt;br /&gt;
Первый этап обычно содержит несколько этапов [[Обработка естественного языка|обработки естественного языка]], такие, как разбиение  на предложения, разбиение на слова, нормализация текста,&lt;br /&gt;
автоматическая морфологическая разметка и конвертация графем в фонемы (англ. grapheme-to-phoneme conversion, G2P).&lt;br /&gt;
Данный этап принимает в качестве входных параметров текст и возвращает последовательность фонем с различными выделенными лингвистическими особенностями.&lt;br /&gt;
&lt;br /&gt;
Этап синтеза речи, в свою очередь, принимает на вход последовательность фонем и возвращает синтезированную звуковую волну речи.&lt;br /&gt;
Данный этап обычно включает в себя алгоритмы предсказания [https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%81%D0%BE%D0%B4%D0%B8%D1%8F_(%D0%BB%D0%B8%D0%BD%D0%B3%D0%B2%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0)/ просодии] - характеристик речи, описывающих признаки, являющиеся дополнительными к основной артикуляции звука, такие, как тон, ударение, громкость и т.д. &lt;br /&gt;
&lt;br /&gt;
== Генерация звуковой волны ==&lt;br /&gt;
&lt;br /&gt;
Обычно, синтезаторы речи не работают непосредственно с сигналом звуковой волны, а использует некоторое представление этого сигнала, например, спектрограмму. Алгоритм, способный выделить такие параметры и по ним обратно восстановить звуковую волну, называется '''вокодер''' (англ. voice encoder). Примерами таких алгоритмов являются мю-закон &amp;lt;ref name=&amp;quot;mu law&amp;quot;&amp;gt;[http://www.itu.int/rec/dologin_pub.asp?lang=e&amp;amp;id=T-REC-G.711-198811-I!!PDF-E&amp;amp;type=items/ &amp;quot;ITU-T Recommendation G.711&amp;quot;]&amp;lt;/ref&amp;gt; и восстановление сигнала по его спектрограмме. &lt;br /&gt;
&lt;br /&gt;
Мю-закон преобразует каждое значение дискретизированного сигнала &amp;lt;math&amp;gt;\textbf{x} = \{x_1, x_2, \dots, x_T\}&amp;lt;/math&amp;gt;  как&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(x_t) = sign(x_t) \frac{\ln(1+\mu|x_t|)}{\ln(1+\mu)}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\mu = 255&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1 &amp;lt; x_t &amp;lt; 1&amp;lt;/math&amp;gt;, а затем кодирует сигнал как двузначное шестнадцатеричное число, который обозначает некоторый интервал на числовой прямой. Обратное преобразование выбирает значение преобразованного сигнала &amp;lt;math&amp;gt;y_t=f(x_t)&amp;lt;/math&amp;gt; из номера интервала и получает оценку исходного сигнала &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; f^{-1}(y_t) = sign(y_t)(1/\mu)((1+\mu)^{|y_t|}-1), -1 &amp;lt; y_t &amp;lt; 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В качестве представления звукового сигнала может выступать [https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0/ спектрограмма волны] - изображение, показывающее зависимость спектральной плотности мощности сигнала от времени. Спектрограммы отображают частоту и амплитуду сигнала во времени, но не содержат никакой информации о фазе сигнала, из-за чего результат обратного восстановления сигнала по спектрограмме неизбежно отличается от оригинала. Цифровая генерация спектрограммы сигнала &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; сводится к вычислению квадрата амплитуды [https://ru.wikipedia.org/wiki/%D0%9E%D0%BA%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5/ оконного преобразования Фурье]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;spectrogram(t, w) = |STFT(t, w)|^2&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; {{---}} используемое окно и &amp;lt;math&amp;gt;STFT(t, w)&amp;lt;/math&amp;gt; {{---}} оконное преобразование Фурье.&lt;br /&gt;
&lt;br /&gt;
Для восстановления исходного сигнала по его спектрограмме может быть использован алгоритм Гриффина-Лима&amp;lt;ref name=&amp;quot;griffin-lim&amp;quot;&amp;gt;D. Griffin and Jae Lim, &amp;quot;Signal estimation from modified short-time Fourier transform,&amp;quot; ICASSP '83. IEEE International Conference on Acoustics, Speech, and Signal Processing, Boston, Massachusetts, USA, 1983, pp. 804-807, doi: 10.1109/ICASSP.1983.1172092.&amp;lt;/ref&amp;gt;, который основан на минимизации средней квадратичной ошибки между оконным преобразованием Фурье оцениваемого сигнала и имеющимся преобразованием в спектрограмме.&lt;br /&gt;
&lt;br /&gt;
== Классы подходов к синтезу речи ==&lt;br /&gt;
Основными требованиями к технологиям синтеза речи являются естественность (англ. naturalness) и разборчивость (англ. intelligibility).&lt;br /&gt;
Естественность описывает, насколько генерируемая речь близка к человеческой, а разборчивость отражает, насколько сложно понять речь.&lt;br /&gt;
Идеальный синтезатор речи генерирует одновременно и натуральную, и разборчивую речь.&lt;br /&gt;
=== Конкатенативный синтез ===&lt;br /&gt;
'''Конкатенативный синтез''' (англ. concatenative synthesis) основывается на конкатенации предварительно записанных примеров человеческой речи в единую звуковую последовательность. Данный подход синтезирует наиболее естественную речь, но генерируемая речь часто содержит значительные отличия и ошибки по сравнению с человеческой речью. Примеры конкатенативного синтеза:&lt;br /&gt;
&lt;br /&gt;
* '''Синтез с выбором''' (англ. unit selection synthesis) является самым используемым подходом конкатенативного синтеза и использует большую базу данных записанной речи. При создании базы данных записанные фразы могут делиться на различные звуковые единицы, такие, как фоны, дифоны, полуфоны, слоги, морфемы, целые фразы или предложения. При запуске алгоритм генерирует выходную звуковую волну с помощью выбора наилучшей последовательности звуковых единиц из базы данных. Данный выбор обычно реализован с помощью [[Дерево решений и случайный лес|дерева решений]]. Данный подход обеспечивает наиболее естественную речь, так как использует минимальную цифровую обработку сигналов. Недостатком подхода является необходимость в довольно большой базе данных звуков для достижения наибольшей естественности речи. Данный подход являлся самым популярным для общего класса задач синтеза речи, но в последнее время уступает по популярности параметрическому подходу. Примером использования синтеза с выбором является голосовой помощник Siri от Apple &amp;lt;ref name=&amp;quot;apple&amp;quot;&amp;gt;[https://machinelearning.apple.com/research/siri-voices/ Deep Learning for Siri’s Voice: On-device Deep Mixture Density Networks for Hybrid Unit Selection Synthesis.]&amp;lt;/ref&amp;gt; и голосовой помощник Алиса от компании Яндекс &amp;lt;ref&amp;gt;[https://www.seonews.ru/analytics/optimization-2018-chto-nakhoditsya-pod-kapotom-u-alisy/ Optimization 2018: что находится «под капотом» у Алисы.]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* '''Дифонный синтез''' (англ. diphone synthesis) является частным случаем синтеза с выбором, который использует в качестве звуковых единиц дифоны (переход от звука к звуку). Подход использует только один образец каждого дифона. База данных дифонов при этом получается сравнительно небольшой. Например, немецкий язык содержит около 800 дифонов, а испанский {{---}} около 2500. При работе алгоритма просодия входной последовательности накладывается на дифоны в базе данных с помощью различных алгоритмов цифровой обработки сигналов. Данный алгоритм значительно уступает по качеству другим подходам и, кроме меньшего размера базы данных, не дает весомых преимуществ, из-за чего не снискал большой популярности.&lt;br /&gt;
&lt;br /&gt;
* '''Синтез речи, ограниченный предметной областью''' (англ. domain-specific speech synthesis) также является частным случаем синтеза с выбором и использует базу данных предварительно записанных слов, фраз и предложений для составления выходной последовательности. Он используется в задачах, где вариативность и размер используемых фраз ограничены некоторой предметной областью, например, прогнозирование погоды или составление расписания транспорта. Из-за значительной простоты реализации и использования данный подход уже долго применяется в коммерческих продуктах, например, говорящие часы или калькуляторы. При этом данный подход может обеспечивать высокую естественность речи вследствие ограниченности используемой базы данных. Недостатками таких систем является ограниченность областью применимости и неспособность учитывать контекст речи, что может вызывать ощутимые ошибки в некоторых языках.&lt;br /&gt;
&lt;br /&gt;
=== Параметрический синтез ===&lt;br /&gt;
Параметрический синтез (англ. statistical parametrical synthesis) для генерации выходной звуковой волны, в отличии от конкатенативного синтеза, не использует реальные примеры речи, а строит вероятностное распределение некоторых параметров и акустических свойств звуковой волны.&lt;br /&gt;
В начале работы параметрического синтезатора с помощью вокодера извлекаются параметры&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{o} = \{o_1, \dots, o_N\}&amp;lt;/math&amp;gt; дискретизированной звуковой волны &amp;lt;math&amp;gt;\textbf{x} = \{x_1, \dots, x_T\}, -1 &amp;lt; x_i &amp;lt; 1&amp;lt;/math&amp;gt; и лингвистические данные &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; из текста &amp;lt;math&amp;gt;W&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;&lt;br /&gt;
соответствуют параметрам вокодера и количеству сигналов звуковой волны. Затем, генеративная модель, например, [[Марковская цепь|скрытая марковская цепь]],&lt;br /&gt;
[[Нейронные сети, перцептрон#Сети прямого распространения|нейронная сеть прямого распространения]] или [[Рекуррентные нейронные сети|рекуррентная нейронная сеть]], обучается по выделенным параметрам &amp;lt;math&amp;gt;\textbf{o}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;, получая&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{\Lambda} = \arg\max\limits_{\Lambda}p(\textbf{o} | l, \Lambda)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{\Lambda}&amp;lt;/math&amp;gt; {{---}} параметры модели. На этапе синтеза, модель генерирует наиболее правдоподобные параметры вокодера&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{\textbf{o}} = \arg\max\limits_{\textbf{o}}p(\textbf{o} | l, \hat{\Lambda})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходная звуковая волна моделируется с помощью вокодера и параметров &amp;lt;math&amp;gt;\hat{\textbf{o}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данный подход является самым популярным на сегодняшний момент, в том числе из-за того, что он позволяет использовать подходы, основанные на нейронных сетях. Современными продуктами, использующие основанный на глубоком обучении параметрический синтез являются Amazon Lex и Alexa &amp;lt;ref&amp;gt;[https://www.allthingsdistributed.com/2016/11/amazon-ai-and-alexa-for-all-aws-apps.html Bringing the Magic of Amazon AI and Alexa to Apps on AWS.] &amp;lt;/ref&amp;gt;, Google Ассистент &amp;lt;ref name=&amp;quot;cnet wavenet&amp;quot;&amp;gt;Martin, Taylor (May 9, 2018).[https://www.cnet.com/how-to/how-to-get-all-google-assistants-new-voices-right-now/  &amp;quot;Try the all-new Google Assistant voices right now&amp;quot;]. CNET.&amp;lt;/ref&amp;gt; и умные дисплеи Portal от Facebook &amp;lt;ref&amp;gt;[https://venturebeat.com/2020/05/15/facebooks-voice-synthesis-ai-generates-speech-in-500-milliseconds/ Facebook’s voice synthesis AI generates speech in 500 milliseconds.]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
== Алгоритмы, основанные на нейронных сетях ==&lt;br /&gt;
=== WaveNet ===&lt;br /&gt;
WaveNet&amp;lt;ref name=&amp;quot;wavenet&amp;quot;&amp;gt;Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&amp;lt;/ref&amp;gt; является [[Порождающие модели | порождающей моделью]], использующей параметрический подход к синтезу речи. Её задача {{---}} восстановить распределение вероятностей звукового сигнала&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{x} = \{x_1, x_2, \dots, x_T\}&amp;lt;/math&amp;gt; с помощью произведения условных вероятностей:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\textbf{x})=\prod\limits_{t=1}^{T} p(x_t | x_1, x_2, \dots, x_{t-1})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, вероятность каждого сигнала &amp;lt;math&amp;gt;x_t&amp;lt;/math&amp;gt; зависит от вероятностей предыдущих сигналов. При этом, в качестве вокодера используется [[Синтез речи#Генерация звуковой волны | мю-закон]].&lt;br /&gt;
Модель представляет собой множество слоев сверточной нейронной сети, аналогично модели [[PixelRNN_и_PixelCNN | PixelCNN]].&lt;br /&gt;
Сеть не содержит уровней [[Сверточные нейронные сети#Пулинговый слой | пулинга]] и выходной вектор имеет размерность, равную размерности входного вектора.&lt;br /&gt;
Выходом модели является категориальное распределение вероятности, получаемое с помощью softmax-преобразования.&lt;br /&gt;
&lt;br /&gt;
Основной идеей модели является использование причинных сверточных сетей (англ. causal convolution layers) и [[Сверточные нейронные сети#Расширенная свертка (aнгл. Dilated convolution) | расширенных ]] причинных сверточных сетей (англю dilated causal convolution layers).&lt;br /&gt;
Причинная сверточная сеть представляет собой несколько уровней сверточной нейронной сети, связанных между собой в порядке, который не нарушает последовательность&lt;br /&gt;
входного сигнала, т.е. оцениваемая в момент времени &amp;lt;math&amp;gt;t+1&amp;lt;/math&amp;gt; вероятность сигнала &amp;lt;math&amp;gt;p(x_{t+1} | x_1, x_2, \dots, x_t)&amp;lt;/math&amp;gt; не зависит от сигналов&lt;br /&gt;
в последующие моменты времени &amp;lt;math&amp;gt;t+2, t+3, \dots, T&amp;lt;/math&amp;gt;. Во время обучения сети сигналы из обучающих данных подаются на вход сети одновременно. На этапе генерации&lt;br /&gt;
сигналы на вход модели подаются последовательно: каждый сгенерированный моделью сигнал подается обратно на вход для генерации последующего. Причинные сверточные сети обучаются&lt;br /&gt;
быстрее, чем [[Рекуррентные нейронные сети | рекуррентные нейронные сети]], но требуют достаточно большого количества уровней для обеспечивания большого окна восприятия сигнала (англ. signal reception window) {{---}} количество предыдущих сигналов, от которых зависит оценка сигнала в текущий момент.&lt;br /&gt;
&lt;br /&gt;
[[Файл:dilated-causal-convolutions.png|thumb|300px| Рисунок 1 —  строение причинной сверточной сети (сверху) и расширенной причинной сверточной сети (снизу)&amp;lt;ref name=&amp;quot;wavenet&amp;quot;&amp;gt;Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
Модификация причинных сверточных сетей, называемая расширенные причинные сверточные сети, способна увеличить окно восприятия сигнала в разы и является основной идеей модели WaveNet.&lt;br /&gt;
Модификация заключается в применении свертки к области размерности большей, чем её длина, пропуская входные связи с некоторым шагом. Данный подход аналогичен применению пулинга или свертки с шагом большим единицы, но выходом расширенной причинной сверточной сети является последовательность размерности, равной размерности входной последовательности. Расширенные причинные сверточные сети способны достигать большего окна&lt;br /&gt;
восприятия сигнала, используя меньшее количество уровней, при этом сохраняя вычислительную сложность причинных сверточных сетей. Структура причинных сверточных сетей изображена на Рисунке 1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:wavenet.png|thumb|300px| Рисунок 2 —  строение модели WaveNet &amp;lt;ref name=&amp;quot;wavenet&amp;quot;&amp;gt;Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
Полная структура модели WaveNet изображена на Рисунке 2. Модель на вход принимает закодированную мю-законом последовательность сигналов &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; и, опционально, некоторую дополнительную информацию, обозначаемую как вектор параметров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, а на выходе возвращает распределение вероятностей для параметров мю-закона, по которым можно восстановить сигнал. В случае использования модели для генерации речи по тексту, данный вектор может содержать информацию о рассматриваемом тексте. Сама модель представляет собой набор из &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; [[Сверточные нейронные сети#Residual block | блоков с остаточной связью]], содержащих преобразование расширенной причинной свертки и функцию активации.&lt;br /&gt;
&lt;br /&gt;
Функция активации при этом аналогична функции, предложенной в модели Gated PixelCNN &amp;lt;ref&amp;gt;Aaron van den Oord, Nal Kalchbrenner, Oriol Vinyals, Lasse Espeholt, Alex Graves, &amp;amp; Koray Kavukcuoglu. (2016). Conditional Image Generation with PixelCNN Decoders. [https://arxiv.org/abs/1606.05328/ arXiv:1606.05328]&lt;br /&gt;
&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{y} = \tanh(W_{f, k} * \textbf{x}) \odot \sigma(W_{g,k}*\textbf{x})&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; {{---}} номер слоя модели, &amp;lt;math&amp;gt;f, g&amp;lt;/math&amp;gt; {{---}} индексы входов преобразования, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; {{---}} функция сигмоиды, &amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt; {{---}} операция свертки, &amp;lt;math&amp;gt;\odot&amp;lt;/math&amp;gt; {{---}} операция покомпонентного умножения векторов и &amp;lt;math&amp;gt;W&amp;lt;/math&amp;gt; {{---}} выученные параметры свертки.&lt;br /&gt;
&lt;br /&gt;
В случае использования дополнительной информации &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; модель оценивает распределение вероятностей звукового сигнала как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\textbf{x}|\textbf{h})=\prod\limits_{t=1}^{T} p(x_t | x_1, x_2, \dots, x_{t-1}, \textbf{h})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для использования дополнительной информации &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt; функция активации может использовать вектор &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt; глобально при вычислении каждой свертки как&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{y} = \tanh(W_{f, k} * \textbf{x} + V_{f,k}^T\textbf{h}) \odot \sigma(W_{g,k}*\textbf{x}+V_{g,k}^T\textbf{h})&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;V_{f,k}&amp;lt;/math&amp;gt; {{---}} выученные параметры линейной проекции. В случае, когда размерность вектора &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt; меньше, чем размерность &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt;, можно использовать upsampling-преобразование сверточных сетей, чтобы получить вектор размерности, равной &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt;, и использовать его вместо оригинального вектора &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt;. При этом &amp;lt;math&amp;gt;V_{f,k}*\textbf{y}&amp;lt;/math&amp;gt; будет являться операцией свертки размера 1.&lt;br /&gt;
&lt;br /&gt;
Самый известный пример применения WaveNet для синтеза речи является  технология Google Ассистент, которая использует WaveNet для генерации голосов ассистентов на различных&lt;br /&gt;
языках. Модель позволила значительно сократить количество записей речи актеров озвучки, требуемых для создания голосовой модели&amp;lt;ref name=&amp;quot;cnet wavenet&amp;quot;&amp;gt;Martin, Taylor (May 9, 2018).[https://www.cnet.com/how-to/how-to-get-all-google-assistants-new-voices-right-now/  &amp;quot;Try the all-new Google Assistant voices right now&amp;quot;]. CNET.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
=== Tacotron ===&lt;br /&gt;
[[Файл:Tacotron.PNG|thumb|300px| Рисунок 3 — строение модели Tacotron&amp;lt;ref name=&amp;quot;tacotron&amp;quot;&amp;gt;Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
[[Файл:Tacotron-cbhg.PNG|thumb|300px| Рисунок 4 —строение модуля CBHG модели Tacotron&amp;lt;ref name=&amp;quot;tacotron&amp;quot;&amp;gt;Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
Tacotron {{---}} модель&amp;lt;ref name=&amp;quot;tacotron&amp;quot;&amp;gt;Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&amp;lt;/ref&amp;gt; параметрического синтеза речи, основанная на подходе [[Механизм внимания | seq2seq]], разработанная Google и опубликованная в 2017 году. Модель состоит из кодера, декодера с [[Механизм внимания | вниманием]] и нейронной сети для&lt;br /&gt;
пост-процессинга сигнала. Схема модели изображена на Рисунке 2.&lt;br /&gt;
&lt;br /&gt;
Кодер и сеть пост-процессинга опираются на блок CBHG, схема которого изображена на Рисунке 3. Блок состоит из набора одномерных сверточных фильтров, за которыми следуют&lt;br /&gt;
шоссейные нейронные сети (англ. highway networks)&amp;lt;ref&amp;gt;Rupesh Kumar Srivastava, Klaus Greff, and J ̈urgen Schmidhuber. Highway networks. [https://arxiv.org/abs/1505.00387/ arXiv:1505.00387], 2015.&amp;lt;/ref&amp;gt;, являющиеся модификацией [[Долгая краткосрочная память | LSTM сетей]], и двунаправленный [[Долгая краткосрочная память#Управляемые рекуррентные нейроны | управляемый рекуррентный блок]]. Входная последовательность сначала обрабатывается &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;&lt;br /&gt;
наборами сверточных фильтров с размерностью &amp;lt;math&amp;gt;1, 2, \dots, K&amp;lt;/math&amp;gt;. Эти фильтры моделируют локальную и контекстно-зависимую информацию (по аналогии с моделированием униграмм,&lt;br /&gt;
биграмм, вплоть до &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;-грамм). Выход сверточного уровня далее обрабатывается шоссейной сетью для дальнейшего выделения параметров. В конце CBHG&lt;br /&gt;
используется управляемый рекуррентный блок для выделения параметров, опираясь на контекст перед рассматриваемым символом и после рассматриваемого символа.&lt;br /&gt;
&lt;br /&gt;
Задача кодера заключается в извлечении последовательных параметров из текста. Его входом является последовательность символов, в которой каждый символ был закодирован one-hot&lt;br /&gt;
кодированием и объединен в единый непрерывный вектор. К данному входу применяется ряд нелинейных преобразований в виде сети с бутылочным горлышком (bottleneck layer), что позволяет улучшить&lt;br /&gt;
обобщаемость сети и ускорить сходимость. Модуль CBHG преобразует выход нелинейных преобразований в итоговое представление текста, которая передается в декодер.&lt;br /&gt;
&lt;br /&gt;
Декодер является рекуррентной нейронной сетью с вниманием, в которой запрос внимания генерируется каждый временной промежуток. Вектор контекста соединяется с выходом ячейки внимания&lt;br /&gt;
и подается на вход декодирующим рекуррентным нейронным сетям, которые являются управляемыми рекуррентными блоками. Выходом декодера является спектрограмма звуковой волны, которая&lt;br /&gt;
передается сети пост-обработки для генерации непосредственно звуковой волны.&lt;br /&gt;
&lt;br /&gt;
В качестве сети пост-обработки используется модуль CBHG, описанный ранее. После этого спектрограмма звуковой волны передается на вход [[Синтез речи#Генерация звуковой волны | алгоритму Гриффина-Лима]].&lt;br /&gt;
&lt;br /&gt;
== Проблемы ==&lt;br /&gt;
=== Задача обработки текста === &lt;br /&gt;
Алгоритмы обработки текста могут не справляться с обработкой определенных частей речи, таких, как аббревиатуры, числа и гетеронимы. Произношение определенных слов также зависит от контекста их применения. Большинство систем синтеза речи по тексту не способны выделять контекст предложений и используют различные эвристические подходы с целью различить омографы (слова с одинаковым написанием, но различным произношением).&lt;br /&gt;
=== Преобразование текста в фонемы ===&lt;br /&gt;
Процесс преобразования текста в фонемы обычно подразделяется на два подхода {{---}} словарный и основанный на правилах. Словарный подход использует словарь с записанными фонетическими представлениями слов и в процессе работы производит поиск в нем с целью конвертации слова в последовательность фонем. Основанный на правилах подход использует набор правил, которые применяются к словам или частям слов с целью выделения фонем. Оба эти подхода имеют существенные недостатки и требуют усовершенствования.&lt;br /&gt;
=== Оценка качества ===&lt;br /&gt;
На данный момент не существует единых критериев оценки качества синтезаторов речи. В каждом отдельном применении технологии синтеза речи могут быть в том числе свои критерии качества, связанные с предметной областью или используемым оборудованием. С другой стороны, ряд исследователей начали оценивать синтезаторы речи используя распространенные наборы данных для синтеза речи &amp;lt;ref&amp;gt;[http://festvox.org/blizzard/ Blizzard Challenge]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
== См. также ==&lt;br /&gt;
&lt;br /&gt;
* [[Нейронные сети, перцептрон ]]&lt;br /&gt;
* [[Сверточные нейронные сети ]]&lt;br /&gt;
* [[ Рекуррентные нейронные сети ]]&lt;br /&gt;
* [[ Механизм внимания ]]&lt;br /&gt;
* [[ Распознавание речи ]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&lt;br /&gt;
* Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B8%D0%BD%D1%82%D0%B5%D0%B7_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=78576</id>
		<title>Синтез речи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B8%D0%BD%D1%82%D0%B5%D0%B7_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=78576"/>
				<updated>2021-01-15T12:47:38Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: Добавлен раздел про генерацию звуковой волны, дополнен раздел про WaveNet&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}[[Категория:Машинное обучение]]&lt;br /&gt;
'''Синтез речи''' (англ. speech synthesis) {{---}} процесс генерации компьютером человеческой речи. Компьютерная система, способная к синтезу речи, называется речевым синтезатором.&lt;br /&gt;
Система, генерирующая человеческую речь, основываясь на тексте, называется '''text-to-speech''' системой (сокр. TTS).&lt;br /&gt;
&lt;br /&gt;
В процессе человеческой речи нервная система транслирует некоторый текст или мысленный концепт в движение мышц, связанных с органами дыхания и речи. Затем производится генерация акустического сигнала с помощью потока воздуха из легких. Сигнал содержит как периодические компоненты (созданные с помощью вибрации органов речи), так и апериодические&lt;br /&gt;
(созданные окружающей средой и фоновым шумом). Используя изменяющиеся во времени сокращения мышц, меняются частотные характеристики акустического сигнала.&lt;br /&gt;
Задача систем генерации речи по тексту {{---}} симулировать данный процесс в каком-либо виде.&lt;br /&gt;
&lt;br /&gt;
== Этапы синтеза речи ==&lt;br /&gt;
Работу систем синтеза речи по тексту, как правило, можно разделить на два этапа, за которые отвечают два отдельных компонента {{---}} обработка текста и синтез речи.&lt;br /&gt;
&lt;br /&gt;
Первый этап обычно содержит несколько этапов [[Обработка естественного языка|обработки естественного языка]], такие, как разбиение  на предложения, разбиение на слова, нормализация текста,&lt;br /&gt;
автоматическая морфологическая разметка и конвертация графем в фонемы (англ. grapheme-to-phoneme conversion, G2P).&lt;br /&gt;
Данный этап принимает в качестве входных параметров текст и возвращает последовательность фонем с различными выделенными лингвистическими особенностями.&lt;br /&gt;
&lt;br /&gt;
Этап синтеза речи, в свою очередь, принимает на вход последовательность фонем и возвращает синтезированную звуковую волну речи.&lt;br /&gt;
Данный этап обычно включает в себя алгоритмы предсказания [https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%81%D0%BE%D0%B4%D0%B8%D1%8F_(%D0%BB%D0%B8%D0%BD%D0%B3%D0%B2%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0)/ просодии] - характеристик речи, описывающих признаки, являющиеся дополнительными к основной артикуляции звука, такие, как тон, ударение, громкость и т.д. &lt;br /&gt;
&lt;br /&gt;
== Генерация звуковой волны ==&lt;br /&gt;
&lt;br /&gt;
Обычно, синтезаторы речи не работают непосредственно с сигналом звуковой волны, а использует некоторое представление этого сигнала, например, спектрограмму. Алгоритм, способный выделить такие параметры и по ним обратно восстановить звуковую волну, называется '''вокодер''' (англ. voice encoder). Примерами таких алгоритмов являются мю-закон &amp;lt;ref name=&amp;quot;mu law&amp;quot;&amp;gt;[http://www.itu.int/rec/dologin_pub.asp?lang=e&amp;amp;id=T-REC-G.711-198811-I!!PDF-E&amp;amp;type=items/ &amp;quot;ITU-T Recommendation G.711&amp;quot;]&amp;lt;/ref&amp;gt; и восстановление сигнала по его спектрограмме. &lt;br /&gt;
&lt;br /&gt;
Мю-закон преобразует каждое значение дискретизированного сигнала &amp;lt;math&amp;gt;\textbf{x} = \{x_1, x_2, \dots, x_T\}&amp;lt;/math&amp;gt;  как&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(x_t) = sign(x_t) \frac{\ln(1+\mu|x_t|)}{\ln(1+\mu)}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\mu = 255&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1 &amp;lt; x_t &amp;lt; 1&amp;lt;/math&amp;gt;, а затем кодирует сигнал как двузначное шестнадцатеричное число, который обозначает некоторый интервал на числовой прямой. Обратное преобразование выбирает значение преобразованного сигнала &amp;lt;math&amp;gt;y_t=f(x_t)&amp;lt;/math&amp;gt; из номера интервала и получает оценку исходного сигнала &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; f^{-1}(y_t) = sign(y_t)(1/\mu)((1+\mu)^{|y_t|}-1), -1 &amp;lt; y_t &amp;lt; 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм [[Синтез речи#WaveNet | WaveNet]] использует закодированные номера интервалов как входную последовательность.&lt;br /&gt;
&lt;br /&gt;
В качестве представления звукового сигнала может выступать [https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0/ спектрограмма волны] - изображение, показывающее зависимость спектральной плотности мощности сигнала от времени. Спектрограммы отображают частоту и амплитуду сигнала во времени, но не содержат никакой информации о фазе сигнала, из-за чего результат обратного восстановления сигнала по спектрограмме неизбежно отличается от оригинала. Цифровая генерация спектрограммы сигнала &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; сводится к вычислению квадрата амплитуды [https://ru.wikipedia.org/wiki/%D0%9E%D0%BA%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5/ оконного преобразования Фурье]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;spectrogram(t, w) = |STFT(t, w)|^2&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; {{---}} используемое окно и &amp;lt;math&amp;gt;STFT(t, w)&amp;lt;/math&amp;gt; {{---}} оконное преобразование Фурье.&lt;br /&gt;
&lt;br /&gt;
Для восстановления исходного сигнала по его спектрограмме может быть использован алгоритм Гриффина-Лима&amp;lt;ref name=&amp;quot;griffin-lim&amp;quot;&amp;gt;D. Griffin and Jae Lim, &amp;quot;Signal estimation from modified short-time Fourier transform,&amp;quot; ICASSP '83. IEEE International Conference on Acoustics, Speech, and Signal Processing, Boston, Massachusetts, USA, 1983, pp. 804-807, doi: 10.1109/ICASSP.1983.1172092.&amp;lt;/ref&amp;gt;, который основан на минимизации средней квадратичной ошибки между оконным преобразованием Фурье оцениваемого сигнала и имеющимся преобразованием в спектрограмме.&lt;br /&gt;
&lt;br /&gt;
== Классы подходов к синтезу речи ==&lt;br /&gt;
Основными требованиями к технологиям синтеза речи являются естественность (англ. naturalness) и разборчивость (англ. intelligibility).&lt;br /&gt;
Естественность описывает, насколько генерируемая речь близка к человеческой, а разборчивость отражает, насколько сложно понять речь.&lt;br /&gt;
Идеальный синтезатор речи генерирует одновременно и натуральную, и разборчивую речь.&lt;br /&gt;
=== Конкатенативный синтез ===&lt;br /&gt;
'''Конкатенативный синтез''' (англ. concatenative synthesis) основывается на конкатенации предварительно записанных примеров человеческой речи в единую звуковую последовательность. Данный подход синтезирует наиболее естественную речь, но генерируемая речь часто содержит значительные отличия и ошибки по сравнению с человеческой речью. Примеры конкатенативного синтеза:&lt;br /&gt;
&lt;br /&gt;
* '''Синтез с выбором''' (англ. unit selection synthesis) является самым используемым подходом конкатенативного синтеза и использует большую базу данных записанной речи. При создании базы данных записанные фразы могут делиться на различные звуковые единицы, такие, как фоны, дифоны, полуфоны, слоги, морфемы, целые фразы или предложения. При запуске алгоритм генерирует выходную звуковую волну с помощью выбора наилучшей последовательности звуковых единиц из базы данных. Данный выбор обычно реализован с помощью [[Дерево решений и случайный лес|дерева решений]]. Данный подход обеспечивает наиболее естественную речь, так как использует минимальную цифровую обработку сигналов. Недостатком подхода является необходимость в довольно большой базе данных звуков для достижения наибольшей естественности речи.&lt;br /&gt;
&lt;br /&gt;
* '''Дифонный синтез''' (англ. diphone synthesis) является частным случаем синтеза с выбором, который использует в качестве звуковых единиц дифоны (переход от звука к звуку). Подход использует только один образец каждого дифона. База данных дифонов при этом получается сравнительно небольшой. Например, немецкий язык содержит около 800 дифонов, а испанский {{---}} около 2500. При работе алгоритма просодия входной последовательности накладывается на дифоны в базе данных с помощью различных алгоритмов цифровой обработки сигналов. Данный алгоритм значительно уступает по качеству другим подходам и, кроме меньшего размера базы данных, не дает весомых преимуществ.&lt;br /&gt;
&lt;br /&gt;
* '''Синтез речи, ограниченный предметной областью''' (англ. domain-specific speech synthesis) также является частным случаем синтеза с выбором и использует базу данных предварительно записанных слов, фраз и предложений для составления выходной последовательности. Он используется в задачах, где вариативность и размер используемых фраз ограничены некоторой предметной областью, например, прогнозирование погоды или составление расписания транспорта. Из-за значительной простоты реализации и использования данный подход уже долго применяется в коммерческих продуктах, например, говорящие часы или калькуляторы. При этом данный подход может обеспечивать высокую естественность речи вследствие ограниченности используемой базы данных. Недостатками таких систем является ограниченность областью применимости и неспособность учитывать контекст речи, что может вызывать ощутимые ошибки в некоторых языках.&lt;br /&gt;
&lt;br /&gt;
=== Параметрический синтез ===&lt;br /&gt;
Параметрический синтез (англ. statistical parametrical synthesis) для генерации выходной звуковой волны, в отличии от конкатенативного синтеза, не использует реальные примеры речи, а строит вероятностное распределение некоторых параметров и акустических свойств звуковой волны.&lt;br /&gt;
В начале работы параметрического синтезатора с помощью вокодера извлекаются параметры&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{o} = \{o_1, \dots, o_N\}&amp;lt;/math&amp;gt; дискретизированной звуковой волны &amp;lt;math&amp;gt;\textbf{x} = \{x_1, \dots, x_T\}, -1 &amp;lt; x_i &amp;lt; 1&amp;lt;/math&amp;gt; и лингвистические данные &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; из текста &amp;lt;math&amp;gt;W&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;&lt;br /&gt;
соответствуют параметрам вокодера и количеству сигналов звуковой волны. Затем, генеративная модель, например, [[Марковская цепь|скрытая марковская цепь]],&lt;br /&gt;
[[Нейронные сети, перцептрон#Сети прямого распространения|нейронная сеть прямого распространения]] или [[Рекуррентные нейронные сети|рекуррентная нейронная сеть]], обучается по выделенным параметрам &amp;lt;math&amp;gt;\textbf{o}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;, получая&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{\Lambda} = \arg\max\limits_{\Lambda}p(\textbf{o} | l, \Lambda)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{\Lambda}&amp;lt;/math&amp;gt; {{---}} параметры модели. На этапе синтеза, модель генерирует наиболее правдоподобные параметры вокодера&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{\textbf{o}} = \arg\max\limits_{\textbf{o}}p(\textbf{o} | l, \hat{\Lambda})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходная звуковая волна моделируется с помощью вокодера и параметров &amp;lt;math&amp;gt;\hat{\textbf{o}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
== Алгоритмы, основанные на нейронных сетях ==&lt;br /&gt;
=== WaveNet ===&lt;br /&gt;
WaveNet&amp;lt;ref&amp;gt;Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&amp;lt;/ref&amp;gt; является [[Порождающие модели | порождающей моделью]], использующей параметрический подход к синтезу речи. Её задача {{---}} восстановить распределение вероятностей звукового сигнала&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{x} = \{x_1, x_2, \dots, x_T\}&amp;lt;/math&amp;gt; с помощью произведения условных вероятностей:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\textbf{x})=\prod\limits_{t=1}^{T} p(x_t | x_1, x_2, \dots, x_{t-1})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, вероятность каждого сигнала &amp;lt;math&amp;gt;x_t&amp;lt;/math&amp;gt; зависит от вероятностей предыдущих сигналов. При этом, в качестве вокодера используется [[Синтез речи#Генерация звуковой волны | мю-закон]].&lt;br /&gt;
Модель представляет собой множество слоев сверточной нейронной сети, аналогично модели [[PixelRNN_и_PixelCNN | PixelCNN]].&lt;br /&gt;
Сеть не содержит уровней [[Сверточные нейронные сети#Пулинговый слой | пулинга]] и выходной вектор имеет размерность, равную размерности входного вектора.&lt;br /&gt;
Выходом модели является категориальное распределение вероятности, получаемое с помощью softmax-преобразования.&lt;br /&gt;
&lt;br /&gt;
Основной идеей модели является использование причинных сверточных сетей (англ. causal convolution layers) и [[Сверточные нейронные сети#Расширенная свертка (aнгл. Dilated convolution) | расширенных ]] причинных сверточных сетей (англю dilated causal convolution layers).&lt;br /&gt;
Причинная сверточная сеть представляет собой несколько уровней сверточной нейронной сети, связанных между собой в порядке, который не нарушает последовательность&lt;br /&gt;
входного сигнала, т.е. оцениваемая в момент времени &amp;lt;math&amp;gt;t+1&amp;lt;/math&amp;gt; вероятность сигнала &amp;lt;math&amp;gt;p(x_{t+1} | x_1, x_2, \dots, x_t)&amp;lt;/math&amp;gt; не зависит от сигналов&lt;br /&gt;
в последующие моменты времени &amp;lt;math&amp;gt;t+2, t+3, \dots, T&amp;lt;/math&amp;gt;. Во время обучения сети сигналы из обучающих данных подаются на вход сети одновременно. На этапе генерации&lt;br /&gt;
сигналы на вход модели подаются последовательно: каждый сгенерированный моделью сигнал подается обратно на вход для генерации последующего. Причинные сверточные сети обучаются&lt;br /&gt;
быстрее, чем [[Рекуррентные нейронные сети | рекуррентные нейронные сети]], но требуют достаточно большого количества уровней для обеспечивания большого окна восприятия сигнала (англ. signal reception window) {{---}} количество предыдущих сигналов, от которых зависит оценка сигнала в текущий момент.&lt;br /&gt;
&lt;br /&gt;
[[Файл:dilated-causal-convolutions.png|thumb|300px| Рисунок 1 —  [https://arxiv.org/abs/1609.03499/ строение причинной сверточной сети (сверху) и расширенной причинной сверточной сети (снизу)]]]&lt;br /&gt;
Модификация причинных сверточных сетей, называемая расширенные причинные сверточные сети, способна увеличить окно восприятия сигнала в разы и является основной идеей модели WaveNet.&lt;br /&gt;
Модификация заключается в применении свертки к области размерности большей, чем её длина, пропуская входные связи с некоторым шагом. Данный подход аналогичен применению пулинга или свертки с шагом большим единицы, но выходом расширенной причинной сверточной сети является последовательность размерности, равной размерности входной последовательности. Расширенные причинные сверточные сети способны достигать большего окна&lt;br /&gt;
восприятия сигнала, используя меньшее количество уровней, при этом сохраняя вычислительную сложность причинных сверточных сетей. Структура причинных сверточных сетей изображена на Рисунке 1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:wavenet.png|thumb|300px| Рисунок 2 —  [https://arxiv.org/abs/1609.03499/ строение модели WaveNet]]]&lt;br /&gt;
Полная структура модели WaveNet изображена на Рисунке 2. Модель на вход принимает закодированную мю-законом последовательность сигналов &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt; и, опционально, некоторую дополнительную информацию, обозначаемую как вектор параметров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, а на выходе возвращает распределение вероятностей для параметров мю-закона, по которым можно восстановить сигнал. В случае использования модели для генерации речи по тексту, данный вектор может содержать информацию о рассматриваемом тексте. Сама модель представляет собой набор из &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; [[Сверточные нейронные сети#Residual block | блоков с остаточной связью]], содержащих преобразование расширенной причинной свертки и функцию активации.&lt;br /&gt;
&lt;br /&gt;
Функция активации при этом аналогична функции, предложенной в модели Gated PixelCNN &amp;lt;ref&amp;gt;Aaron van den Oord, Nal Kalchbrenner, Oriol Vinyals, Lasse Espeholt, Alex Graves, &amp;amp; Koray Kavukcuoglu. (2016). Conditional Image Generation with PixelCNN Decoders. [https://arxiv.org/abs/1606.05328/ arXiv:1606.05328]&lt;br /&gt;
&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{y} = \tanh(W_{f, k} * \textbf{x}) \odot \sigma(W_{g,k}*\textbf{x})&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; {{---}} номер слоя модели, &amp;lt;math&amp;gt;f, g&amp;lt;/math&amp;gt; {{---}} индексы входов преобразования, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; {{---}} функция сигмоиды, &amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt; {{---}} операция свертки, &amp;lt;math&amp;gt;\odot&amp;lt;/math&amp;gt; {{---}} операция покомпонентного умножения векторов и &amp;lt;math&amp;gt;W&amp;lt;/math&amp;gt; {{---}} выученные параметры свертки.&lt;br /&gt;
&lt;br /&gt;
В случае использования дополнительной информации &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; модель оценивает распределение вероятностей звукового сигнала как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\textbf{x}|\textbf{h})=\prod\limits_{t=1}^{T} p(x_t | x_1, x_2, \dots, x_{t-1}, \textbf{h})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для использования дополнительной информации &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt; функция активации может использовать вектор &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt; глобально при вычислении каждой свертки как&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{y} = \tanh(W_{f, k} * \textbf{x} + V_{f,k}^T\textbf{h}) \odot \sigma(W_{g,k}*\textbf{x}+V_{g,k}^T\textbf{h})&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;V_{f,k}&amp;lt;/math&amp;gt; {{---}} выученные параметры линейной проекции. В случае, когда размерность вектора &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt; меньше, чем размерность &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt;, можно использовать upsampling-преобразование сверточных сетей, чтобы получить вектор размерности, равной &amp;lt;math&amp;gt;\textbf{x}&amp;lt;/math&amp;gt;, и использовать его вместо оригинального вектора &amp;lt;math&amp;gt;\textbf{h}&amp;lt;/math&amp;gt;. При этом &amp;lt;math&amp;gt;V_{f,k}*\textbf{y}&amp;lt;/math&amp;gt; будет являться операцией свертки размера 1.&lt;br /&gt;
&lt;br /&gt;
Самый известный пример применения WaveNet для синтеза речи является  технология Google Ассистент, которая использует WaveNet для генерации голосов ассистентов на различных&lt;br /&gt;
языках. Модель позволила значительно сократить количество записей речи актеров озвучки, требуемых для создания голосовой модели&amp;lt;ref name=&amp;quot;cnet wavenet&amp;quot;&amp;gt;Martin, Taylor (May 9, 2018).[https://www.cnet.com/how-to/how-to-get-all-google-assistants-new-voices-right-now/  &amp;quot;Try the all-new Google Assistant voices right now&amp;quot;]. CNET.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
=== Tacotron ===&lt;br /&gt;
[[Файл:Tacotron.PNG|thumb|300px| Рисунок 3 — [https://arxiv.org/abs/1703.10135/ строение модели Tacotron]]]&lt;br /&gt;
[[Файл:Tacotron-cbhg.PNG|thumb|300px| Рисунок 4 — [https://arxiv.org/abs/1703.10135/ строение модуля CBHG модели Tacotron]]]&lt;br /&gt;
Tacotron {{---}} модель&amp;lt;ref&amp;gt;Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&amp;lt;/ref&amp;gt; параметрического синтеза речи, основанная на подходе [[Механизм внимания | seq2seq]], разработанная Google и опубликованная в 2017 году. Модель состоит из кодера, декодера с [[Механизм внимания | вниманием]] и нейронной сети для&lt;br /&gt;
пост-процессинга сигнала. Схема модели изображена на Рисунке 2.&lt;br /&gt;
&lt;br /&gt;
Кодер и сеть пост-процессинга опираются на блок CBHG, схема которого изображена на Рисунке 3. Блок состоит из набора одномерных сверточных фильтров, за которыми следуют&lt;br /&gt;
шоссейные нейронные сети (англ. highway networks)&amp;lt;ref&amp;gt;Rupesh Kumar Srivastava, Klaus Greff, and J ̈urgen Schmidhuber. Highway networks. [https://arxiv.org/abs/1505.00387/ arXiv:1505.00387], 2015.&amp;lt;/ref&amp;gt;, являющиеся модификацией [[Долгая краткосрочная память | LSTM сетей]], и двунаправленный [[Долгая краткосрочная память#Управляемые рекуррентные нейроны | управляемый рекуррентный блок]]. Входная последовательность сначала обрабатывается &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;&lt;br /&gt;
наборами сверточных фильтров с размерностью &amp;lt;math&amp;gt;1, 2, \dots, K&amp;lt;/math&amp;gt;. Эти фильтры моделируют локальную и контекстно-зависимую информацию (по аналогии с моделированием униграмм,&lt;br /&gt;
биграмм, вплоть до &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;-грамм). Выход сверточного уровня далее обрабатывается шоссейной сетью для дальнейшего выделения параметров. В конце CBHG&lt;br /&gt;
используется управляемый рекуррентный блок для выделения параметров, опираясь на контекст перед рассматриваемым символом и после рассматриваемого символа.&lt;br /&gt;
&lt;br /&gt;
Задача кодера заключается в извлечении последовательных параметров из текста. Его входом является последовательность символов, в которой каждый символ был закодирован one-hot&lt;br /&gt;
кодированием и объединен в единый непрерывный вектор. К данному входу применяется ряд нелинейных преобразований в виде сети с бутылочным горлышком (bottleneck layer), что позволяет улучшить&lt;br /&gt;
обобщаемость сети и ускорить сходимость. Модуль CBHG преобразует выход нелинейных преобразований в итоговое представление текста, которая передается в декодер.&lt;br /&gt;
&lt;br /&gt;
Декодер является рекуррентной нейронной сетью с вниманием, в которой запрос внимания генерируется каждый временной промежуток. Вектор контекста соединяется с выходом ячейки внимания&lt;br /&gt;
и подается на вход декодирующим рекуррентным нейронным сетям, которые являются управляемыми рекуррентными блоками. Выходом декодера является спектрограмма звуковой волны, которая&lt;br /&gt;
передается сети пост-обработки для генерации непосредственно звуковой волны.&lt;br /&gt;
&lt;br /&gt;
В качестве сети пост-обработки используется модуль CBHG, описанный ранее. После этого спектрограмма звуковой волны передается на вход [[Синтез речи#Генерация звуковой волны | алгоритму Гриффина-Лима]].&lt;br /&gt;
&lt;br /&gt;
== Проблемы ==&lt;br /&gt;
=== Задача обработки текста === &lt;br /&gt;
Алгоритмы обработки текста могут не справляться с обработкой определенных частей речи, таких, как аббревиатуры, числа и гетеронимы. Произношение определенных слов также зависит от контекста их применения. Большинство систем синтеза речи по тексту не способны выделять контекст предложений и используют различные эвристические подходы с целью различить омографы (слова с одинаковым написанием, но различным произношением).&lt;br /&gt;
=== Преобразование текста в фонемы ===&lt;br /&gt;
Процесс преобразования текста в фонемы обычно подразделяется на два подхода {{---}} словарный и основанный на правилах. Словарный подход использует словарь с записанными фонетическими представлениями слов и в процессе работы производит поиск в нем с целью конвертации слова в последовательность фонем. Основанный на правилах подход использует набор правил, которые применяются к словам или частям слов с целью выделения фонем. Оба эти подхода имеют существенные недостатки и требуют усовершенствования.&lt;br /&gt;
=== Оценка качества ===&lt;br /&gt;
На данный момент не существует единых критериев оценки качества синтезаторов речи. В каждом отдельном применении технологии синтеза речи могут быть в том числе свои критерии качества, связанные с предметной областью или используемым оборудованием. С другой стороны, ряд исследователей начали оценивать синтезаторы речи используя распространенные наборы данных для синтеза речи &amp;lt;ref&amp;gt;[http://festvox.org/blizzard/ Blizzard Challenge]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
== См. также ==&lt;br /&gt;
&lt;br /&gt;
* [[Нейронные сети, перцептрон ]]&lt;br /&gt;
* [[Сверточные нейронные сети ]]&lt;br /&gt;
* [[ Рекуррентные нейронные сети ]]&lt;br /&gt;
* [[ Механизм внимания ]]&lt;br /&gt;
* [[ Распознавание речи ]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&lt;br /&gt;
* Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Wavenet.png&amp;diff=78555</id>
		<title>Файл:Wavenet.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Wavenet.png&amp;diff=78555"/>
				<updated>2021-01-15T11:38:35Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B8%D0%BD%D1%82%D0%B5%D0%B7_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=78202</id>
		<title>Синтез речи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B8%D0%BD%D1%82%D0%B5%D0%B7_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=78202"/>
				<updated>2021-01-13T17:22:42Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: Добавлены ссылки на рисунки, английские варианты терминов&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}[[Категория:Машинное обучение]]&lt;br /&gt;
'''Синтез речи''' (англ. speech synthesis) {{---}} процесс генерации компьютером человеческой речи. Компьютерная система, способная к синтезу речи, называется речевым синтезатором.&lt;br /&gt;
Система, генерирующая человеческую речь, основываясь на тексте, называется '''text-to-speech''' системой (сокр. TTS).&lt;br /&gt;
&lt;br /&gt;
В процессе человеческой речи сначала транслируется некоторый текст или мысленный концепт в движение мышц, связанных с органами дыхания и речи. Затем, используя поток воздуха из легких,&lt;br /&gt;
производится генерация акустического сигнала, который содержит как периодические компоненты (созданные с помощьью вибрации органов речи), так и апериодические&lt;br /&gt;
(созданные окружающей средой и фоновым шумом). Используя изменяющиеся во времени сокращения мышц, меняются частотные характеристики акустического сигнала.&lt;br /&gt;
Задача систем генерации речи по тексту {{---}} симулировать данный процесс в каком-либо виде.&lt;br /&gt;
&lt;br /&gt;
== Этапы синтеза речи ==&lt;br /&gt;
Работу систем синтеза речи по тексту, как правило, можно разделить на два этапа, за которые отвечают два отдельных компонента {{---}} обработка текста и синтез речи.&lt;br /&gt;
&lt;br /&gt;
Первый этап обычно содержит несколько этапов [[Обработка естественного языка|обработки естественного языка]], такие, как разбиение  на предложения, разбиение на слова, нормализация текста,&lt;br /&gt;
автоматическая морфологическая разметка и конвертация графем в фонемы (англ. grapheme-to-phoneme conversion, G2P).&lt;br /&gt;
Данный этап принимает в качестве входных параметров текст и возвращает последовательность фонем с различными выделенными лингвистическими особенностями.&lt;br /&gt;
&lt;br /&gt;
Этап синтеза речи, в свою очередь, принимает на вход последовательность фонем и возвращает синтезированную звуковую волну речи.&lt;br /&gt;
Данный этап обычно включает в себя алгоритмы предсказания просодии и алгоритмы генерации звуковых волн речи, а так же может содержать&lt;br /&gt;
вокодер (англ. voice encoder) {{---}} алгоритм или устройство,&lt;br /&gt;
способное выделить из звуковой волны определенные параметры и затем использовать её для генерации похожей волны.&lt;br /&gt;
&lt;br /&gt;
== Классы подходов к синтезу речи ==&lt;br /&gt;
Основными требованиями к технологиям синтеза речи являются естественность (англ. naturalness) и разборчивость (англ. intelligibility).&lt;br /&gt;
Естественность описывает, насколько генерируемая речь близка к человеческой, а разборчивость отражает, насколько сложно понять речь.&lt;br /&gt;
Идеальный синтезатор речи генерирует одновременно и натуральную, и разборчивую речь.&lt;br /&gt;
=== Конкатенативный синтез ===&lt;br /&gt;
'''Конкатенативный синтез''' (англ. concatenative synthesis) основывается на конкатенации предварительно записанных примеров человеческой речи в единую звуковую последовательность. Данный подход синтезирует наиболее естественную речь, но генерируемая речь часто содержит значительные отличия и ошибки по сравнению с человеческой речью.&lt;br /&gt;
&lt;br /&gt;
'''Синтез с выбором''' (англ. unit selection synthesis) является самым используемым подходом конкатенативного синтеза и использует большую базу данных записанной речи. При создании базы данных записанные фразы могут делиться на различные звуковые единицы, такие, как фоны, дифоны, полуфоны, слоги, морфемы, целые фразы или предложения. При запуске, алгоритм генерирует выходную звуковую волну с помощью выбора наилучшей последовательности звуковых единиц из базы данных. Данный выбор обычно реализован с помощью [[Дерево решений и случайный лес|дерева решений]].&lt;br /&gt;
Данный подход обеспечивает наиболее естественную речь, так как использует минимальную цифровую обработку сигналов. Недостатком подхода является необходимость в довольно большой базе данных звуков для достижения наибольшей естественности речи.&lt;br /&gt;
&lt;br /&gt;
'''Дифонный синтез''' (англ. diphone synthesis) является частным случаем синтеза с выбором, который использует в качестве звуковых единиц дифоны (переход от звука к звуку). Подход использует только один образец каждого дифона. База данных дифонов при этом получается сравнительно небольшой. Например, немецкий язык содержит около 800 дифонов, а испанский {{---}} около 2500. При работе алгоритма просодия входной последовательности накладывается на дифоны в базе данных с помощью различных алгоритмов цифровой обработки сигналов. Данный алгоритм значительно уступает по качеству другим подходам и, кроме меньшего размера базы данных, не дает весомых преимуществ.&lt;br /&gt;
&lt;br /&gt;
'''Синтез речи, ограниченный предметной областью''' (англ. domain-specific speech synthesis) также является частным случаем синтеза с выбором и использует базу данных предварительно записанных слов, фраз и предложений для составления выходной последовательности. Он используется в задачах, где вариативность и размер используемых фраз ограничены некоторой предметной областью, например, прогнозирование погоды или составление расписания транспорта. Из-за значительной простоты реализации и использования данный подход уже долго применяется в коммерческих продуктах, например, говорящие часы или калькуляторы. При этом данный подход может обеспечивать высокую естественность речи вследствие ограниченности используемой базы данных. Недостатками таких систем является ограниченность областью применимости и неспособность учитывать контекст речи, что может вызывать ощутимые ошибки в некоторых языках.&lt;br /&gt;
&lt;br /&gt;
=== Параметрический синтез ===&lt;br /&gt;
Параметрический синтез (англ. statistical parametrical synthesis) для генерации выходной звуковой волны, в отличии от конкатенативного синтеза, не использует реальные примеры речи, а строит вероятностное распределение некоторых параметров и акустических свойств звуковой волны.&lt;br /&gt;
В начале работы параметрического синтезатора с помощью вокодера извлекаются параметры&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{o} = \{o_1, \dots, o_N\}&amp;lt;/math&amp;gt; дискретизированной звуковой волны &amp;lt;math&amp;gt;\textbf{x} = \{x_1, \dots, x_T\}, -1 &amp;lt; x_i &amp;lt; 1&amp;lt;/math&amp;gt; и лингвистические данные &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; из текста &amp;lt;math&amp;gt;W&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;&lt;br /&gt;
соответствуют параметрам вокодера и количеству сигналов звуковой волны. Затем, генеративная модель, например, [[Марковская цепь|скрытая марковская цепь]],&lt;br /&gt;
[[Нейронные сети, перцептрон#Сети прямого распространения|нейронная сеть прямого распространения]] или [[Рекуррентные нейронные сети|рекуррентная нейронная сеть]], обучается по выделенным параметрам &amp;lt;math&amp;gt;\textbf{o}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;, получая&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{\Lambda} = \arg\max\limits_{\Lambda}p(\textbf{o} | l, \Lambda)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{\Lambda}&amp;lt;/math&amp;gt; {{---}} параметры модели. На этапе синтеза, модель генерирует наиболее правдоподобные параметры вокодера&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{\textbf{o}} = \arg\max\limits_{\textbf{o}}p(\textbf{o} | l, \hat{\Lambda})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходная звуковая волна моделируется с помощью вокодера и параметров &amp;lt;math&amp;gt;\hat{\textbf{o}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
== Алгоритмы, основанные на нейронных сетях ==&lt;br /&gt;
=== WaveNet ===&lt;br /&gt;
[[Файл:dilated-causal-convolutions.png|thumb|300px| [https://arxiv.org/abs/1609.03499/ Рисунок 1 — строение причинной сверточной сети (сверху) и расширенной причинной сверточной сети (снизу)]]]&lt;br /&gt;
WaveNet является генеративной моделью, использующей параметрический подход к синтезу речи. Её задача {{---}} восстановить распределение вероятности звукового сигнала&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{x} = \{x_1, x_2, \dots, x_T\}&amp;lt;/math&amp;gt; с помощью произведения условных вероятностей&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\textbf{x})=\prod\limits_{t=1}^{T} p(x_t | x_1, x_2, \dots, x_{t-1})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, вероятность каждого сигнала &amp;lt;math&amp;gt;x_t&amp;lt;/math&amp;gt; зависит от вероятностей предыдущих сигналов. При этом, в качестве вокодера используется преобразование, известное&lt;br /&gt;
как мю-закон &amp;lt;ref name=&amp;quot;mu law&amp;quot;&amp;gt;[http://www.itu.int/rec/dologin_pub.asp?lang=e&amp;amp;id=T-REC-G.711-198811-I!!PDF-E&amp;amp;type=items/ &amp;quot;ITU-T Recommendation G.711&amp;quot;]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;o_t = f(x_t) = sign(x_t) \frac{\ln(1+\mu|x_t|)}{\ln(1+\mu)}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\mu = 255&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1 &amp;lt; x_t &amp;lt; 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Модель представляет собой множество слоев сверточной нейронной сети, аналогично модели [[PixelRNN_и_PixelCNN | PixelCNN]].&lt;br /&gt;
Сеть не содержит уровней пулинга и выходной вектор имеет размерность, равную размерности входного вектора.&lt;br /&gt;
Выходом модели является категориальное распределение вероятности, получаемое с помощью softmax-преобразования.&lt;br /&gt;
&lt;br /&gt;
Основной идеей модели является использование причинных сверточных сетей (англ. causal convolution layers) и [[Сверточные нейронные сети#Расширенная свертка (aнгл. Dilated convolution) | расширенных ]] причинных сверточных сетей (англю dilated causal convolution layers).&lt;br /&gt;
Причинная сверточная сеть представляет собой несколько уровней сверточной нейронной сети, связанных между собой в порядке, который не нарушает последовательность&lt;br /&gt;
входного сигнала, т.е. оцениваемая в момент времени &amp;lt;math&amp;gt;t+1&amp;lt;/math&amp;gt; вероятность сигнала &amp;lt;math&amp;gt;p(x_{t+1} | x_1, x_2, \dots, x_t)&amp;lt;/math&amp;gt; не зависит от сигналов&lt;br /&gt;
в последующие моменты времени &amp;lt;math&amp;gt;t+2, t+3, \dots, T&amp;lt;/math&amp;gt;. Во время обучения сети сигналы из обучающих данных подаются на вход сети одновременно. На этапе генерации&lt;br /&gt;
сигналы на вход модели подаются последовательно: каждый сгенерированный моделью сигнал подается обратно на вход для генерации последующего. Причинные сверточные сети обучаются&lt;br /&gt;
быстрее, чем рекуррентные нейронные сети, но требуют достаточно большого количества уровней для обеспечивания большого окна восприятия сигнала (англ. signal reception window) {{---}} количество предыдущих сигналов, от которых зависит оценка сигнала в текущий момент.&lt;br /&gt;
&lt;br /&gt;
Модификация причинных сверточных сетей, называемая расширенные причинные сверточные сети, способна увеличить окно восприятия сигнала в разы и является основной идеей модели WaveNet.&lt;br /&gt;
Модификация заключается в применении свертки к области размерности большей, чем её длина, пропуская входные связи с некоторым шагом. Данный подход аналогичен применению&lt;br /&gt;
пулинга или свертки с шагом большим единицы, но результирует в выходную последовательность той же размерности. Расширенные причинные сверточные сети способны достигать большего окна&lt;br /&gt;
восприятия сигнала, используя меньшее количество уровней, при этом сохраняя вычислительную сложность причинных сверточных сетей. Структура причинных сверточных сетей изображена на Рисунке 1.&lt;br /&gt;
&lt;br /&gt;
Самый известный пример применения WaveNet для синтеза речи является  технология Google Ассистент, которая использует WaveNet для генерации голосов ассистентов на различных&lt;br /&gt;
языках. Модель позволила значительно сократить количество записей речи актеров озвучки, требуемых для создания голосовой модели&amp;lt;ref name=&amp;quot;cnet wavenet&amp;quot;&amp;gt;Martin, Taylor (May 9, 2018).[https://www.cnet.com/how-to/how-to-get-all-google-assistants-new-voices-right-now/  &amp;quot;Try the all-new Google Assistant voices right now&amp;quot;]. CNET.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
=== Tacotron ===&lt;br /&gt;
[[Файл:Tacotron.PNG|thumb|300px| [https://arxiv.org/abs/1703.10135/ Рисунок 2 — строение модели Tacotron]]]&lt;br /&gt;
[[Файл:Tacotron-cbhg.PNG|thumb|300px| [https://arxiv.org/abs/1703.10135/ Рисунок 3 — строение модуля CBHG модели Tacotron]]]&lt;br /&gt;
Tacotron {{---}} модель параметрического синтеза речи, основанная на подходе [[Механизм внимания | seq2seq]], разработанная Google и опубликованная в 2017 году. Модель состоит из кодера, декодера с [[Механизм внимания | вниманием]] и нейронной сети для&lt;br /&gt;
пост-процессинга сигнала. Схема модели изображена на Рисунке 2.&lt;br /&gt;
&lt;br /&gt;
Кодер и сеть пост-процессинга опираются на блок CBHG, схема которого изображена на Рисунке 3. Блок состоит из набора одномерных сверточных фильтров, за которыми следуют&lt;br /&gt;
шоссейные нейронные сети (англ. highway networks)&amp;lt;ref&amp;gt;Rupesh Kumar Srivastava, Klaus Greff, and J ̈urgen Schmidhuber. Highway networks. [https://arxiv.org/abs/1505.00387/ arXiv:1505.00387], 2015.&amp;lt;/ref&amp;gt;, являющиеся модификацией [[Долгая краткосрочная память | LSTM сетей]], и двунаправленный [[Рекуррентные нейронные сети#Управляемые рекуррентные блоки | управляемый рекуррентный блок]]. Входная последовательность сначала обрабатывается &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;&lt;br /&gt;
наборами сверточных фильтров с размерностью &amp;lt;math&amp;gt;1, 2, \dots, K&amp;lt;/math&amp;gt;. Эти фильтры моделируют локальную и контекстно-зависимую информацию (по аналогии с моделированием униграмм,&lt;br /&gt;
биграмм, вплоть до &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;-грамм). Выход сверточного уровня далее обрабатывается шоссейной сетью для дальнейшего выделения параметров. В конце CBHG&lt;br /&gt;
используется управляемый рекуррентный блок для выделения параметров, опираясь на контекст перед рассматриваемым символом и после рассматриваемого символа.&lt;br /&gt;
&lt;br /&gt;
Задача кодера заключается в извлечении последовательных параметров из текста. Его входом является последовательность символов, в которой каждый символ был закодирован one-hot&lt;br /&gt;
кодированием и объединен в единый непрерывный вектор. К данному входу применяется ряд нелинейных преобразований в виде сети с бутылочным горлышком (bottleneck layer), что позволяет улучшить&lt;br /&gt;
обобщаемость сети и ускорить сходимость. Модуль CBHG преобразует выход нелинейных преобразований в итоговое представление текста, которая передается в декодер.&lt;br /&gt;
&lt;br /&gt;
Декодер является рекуррентной нейронной сетью с вниманием, в которой запрос внимания генерируется каждый временной промежуток. Вектор контекста соединяется с выходом ячейки внимания&lt;br /&gt;
и подается на вход декодирующим рекуррентным нейронным сетям, которые являются управляемыми рекуррентными блоками. Выходом декодера является спектрограмма звуковой волны, которая&lt;br /&gt;
передается сети пост-обработки для генерации непосредственно звуковой волны.&lt;br /&gt;
&lt;br /&gt;
В качестве сети пост-обработки используется модуль CBHG, описанный ранее. После этого спектрограмма звуковой волны передается на вход алгоритму Гриффина-Лима&amp;lt;ref name=&amp;quot;griffin-lim&amp;quot;&amp;gt;D. Griffin and Jae Lim, &amp;quot;Signal estimation from modified short-time Fourier transform,&amp;quot; ICASSP '83. IEEE International Conference on Acoustics, Speech, and Signal Processing, Boston, Massachusetts, USA, 1983, pp. 804-807, doi: 10.1109/ICASSP.1983.1172092.&amp;lt;/ref&amp;gt;, который способен с&lt;br /&gt;
помощью спектрограммы восстановить исходную волну используя быстрое преобразование Фурье.&lt;br /&gt;
&lt;br /&gt;
== Проблемы ==&lt;br /&gt;
=== Задача обработки текста === &lt;br /&gt;
Алгоритмы обработки текста могут не справляться с обработкой определенных частей речи, таких, как аббревиатуры, числа и гетеронимы. Произношение определенных слов также зависит от контекста их применения. Большинство систем синтеза речи по тексту не способны выделять контекст предложений и используют различные эвристические подходы с целью различить омографы (слова с одинаковым написанием, но различным произношением).&lt;br /&gt;
=== Преобразование текста в фонемы ===&lt;br /&gt;
Процесс преобразования текста в фонемы обычно подразделяется на два подхода {{---}} словарный и основанный на правилах. Словарный подход использует словарь с записанными фонетическими представлениями слов и в процессе работы производит поиск в нем с целью конвертации слова в последовательность фонем. Основанный на правилах подход использует набор правил, которые применяются к словам или частям слов с целью выделения фонем. Оба эти подхода имеют существенные недостатки и требуют усовершенствования.&lt;br /&gt;
=== Оценка качества ===&lt;br /&gt;
На данный момент не существует единых критериев оценки качества синтезаторов речи. В каждом отдельном применении технологии синтеза речи могут быть в том числе свои критерии качества, связанные с предметной областью или используемым оборудованием. С другой стороны, ряд исследователей начали оценивать синтезаторы речи используя распространенные наборы данных для синтеза речи &amp;lt;ref&amp;gt;[http://festvox.org/blizzard/ Blizzard Challenge]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
== См. также ==&lt;br /&gt;
&lt;br /&gt;
* [[Нейронные сети, перцептрон ]]&lt;br /&gt;
* [[Сверточные нейронные сети ]]&lt;br /&gt;
* [[ Рекуррентные нейронные сети ]]&lt;br /&gt;
* [[ Механизм внимания ]]&lt;br /&gt;
* [[ Распознавание речи ]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&lt;br /&gt;
* Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B8%D0%BD%D1%82%D0%B5%D0%B7_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=78185</id>
		<title>Синтез речи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B8%D0%BD%D1%82%D0%B5%D0%B7_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=78185"/>
				<updated>2021-01-13T15:50:15Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: Добавлен раздел с проблемами&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}[[Категория:Машинное обучение]]&lt;br /&gt;
'''Синтез речи''' (англ. speech synthesis) - процесс генерации компьютером человеческой речи. Компьютерная система, способная к синтезу речи, называется речевым синтезатором.&lt;br /&gt;
Система, генерирующая человеческую речь, основываясь на тексте, называется '''text-to-speech''' системой (сокр. TTS).&lt;br /&gt;
&lt;br /&gt;
Процесс человеческой речи сначала транслирует некоторый текст или мысленный концепт в движение мышц, связанных с органами дыхания и речи. Затем, используя поток воздуха из легких,&lt;br /&gt;
производится генерация акустического сигнала, который содержит как периодические компоненты (созданные с помощьью вибрации органов речи), так и апериодические&lt;br /&gt;
(созданные окружающей средой и фоновым шумом). Используя изменяющиеся во времени сокращения мышц, меняются частотные характеристики акустического сигнала.&lt;br /&gt;
Задача систем генерации речи по тексту - симулировать данный процесс в каком-либо виде.&lt;br /&gt;
&lt;br /&gt;
== Этапы синтеза речи ==&lt;br /&gt;
Системы синтеза речи по тексту, как правило, можно разделить на два этапа, за которые отвечают два отдельных компонента - обработка текста и синтез речи.&lt;br /&gt;
&lt;br /&gt;
Первый этап обычно содержит несколько этапов [[Обработка естественного языка|обработки естественного языка]], такие, как разбиение  на предложения, разбиение на слова, нормализация текста,&lt;br /&gt;
автоматическая морфологическая разметка, и конвертация графем в фонемы (англ. grapheme-to-phoneme conversion, G2P).&lt;br /&gt;
Данный этап принимает в качестве входных параметров текст и возвращает последовательность фонем с различными выделенными лингвистическими особенностями.&lt;br /&gt;
&lt;br /&gt;
Этап синтеза речи, в свою очередь, принимает на вход последовательность фонем и возвращает синтезированную звуковую волну речи.&lt;br /&gt;
Данный этап обычно включает в себя алгоритмы предсказания просодии и алгоритмы генерации звуковых волн речи, а так же может содержать&lt;br /&gt;
вокодер (англ. voice encoder) - алгоритм или устройство,&lt;br /&gt;
способное выделить из звуковой волны определенные параметры и затем использовать её для генерации похожей волны.&lt;br /&gt;
&lt;br /&gt;
== Классы подходов к синтезу речи ==&lt;br /&gt;
Основными требованиями к технологиям синтеза речи являются естественность (англ. naturalness) и разборчивость (англ. intelligibility).&lt;br /&gt;
Естественность описывает, насколько генерируемая речь близка к человеческой, а разборчивость отражает, насколько сложно понять речь.&lt;br /&gt;
Идеальный синтезатор речи генерирует одновременно и натуральную, и разборчивую речь.&lt;br /&gt;
=== Конкатенативный синтез ===&lt;br /&gt;
'''Конкатенативный синтез''' (англ. concatenative synthesis) основывается на конкатенации предварительно записанных примеров человеческой речи в единую звуковую последовательность. Данный подход генерирует наиболее естественную речь, но генерируемая речь часто содержит значительные отличия и ошибки по сравнению с человеческой речью.&lt;br /&gt;
&lt;br /&gt;
'''Синтез с выбором''' (англ. unit selection synthesis) является самым используемым подходом конкатенативного синтеза и использует большую базу данных записанной речи. При создании базы данных, записанные фразы могут делиться на различные звуковые единицы, такие, как фоны, дифоны, полуфоны, слоги, морфемы, целые фразы или предложения. При запуске, алгоритм генерирует выходную звуковую волну с помощью выбора наилучшей последовательности звуковых единиц из базы данных. Данный выбор обычно реализован с помощью [[Дерево решений и случайный лес|дерева решений]].&lt;br /&gt;
Данный подход обеспечивает наиболее естественную речь, так как использует минимальную цифровую обработку сигналов. Недостатком подхода является необходимость в довольно большой базе данных звуков для достижения наибольшей естественности речи.&lt;br /&gt;
&lt;br /&gt;
'''Дифонный синтез''' (англ. diphone synthesis) является частным случаем синтеза с выбором, который использует в качестве звуковых единиц дифоны (переход от звука к звуку). Подход использует только один образец каждого дифона. База данных дифонов при этом получается сравнительно небольшой. Например, немецкий язык содержит около 800 дифонов, а испанский - около 2500. При работе алгоритма просодия входной последовательности накладывается на дифоны в базе данных с помощью различных алгоритмов цифровой обработки сигналов. Данный алгоритм значительно уступает по качеству другим подходам и, кроме меньшего размера базы данных, не дает весомых преимуществ.&lt;br /&gt;
&lt;br /&gt;
'''Синтез речи, ограниченный предметной областью''' (англ. domain-specific speech synthesis) также является частным случаем синтеза с выбором и использует базу данных предварительно записанных слов, фраз и предложений для составления выходной последовательности. Он используется в задачах, где вариативность и размер используемых фраз ограничены некоторой предметной областью, например, прогнозирование погоды или составление расписания транспорта. Из-за значительной простоты реализации и использования данный подход уже долго применяется в коммерческих продуктах, например, говорящие часы или калькуляторы. При этом данный подход может обеспечивать высокую естественность речи вследствие ограниченности используемой базы данных. Недостатками таких систем является ограниченность областью применимости и неспособность учитывать контекст речи, что может вызывать ощутимые ошибки в некоторых языках.&lt;br /&gt;
&lt;br /&gt;
=== Параметрический синтез ===&lt;br /&gt;
Параметрический синтез (англ. statistical parametrical synthesis) для генерации выходной звуковой волны, в отличии от конкатенативного синтеза, не использует реальные примеры речи, а строит вероятностное распределение некоторых параметров и акустических свойств звуковой волны.&lt;br /&gt;
В начале работы параметрического синтезатора с помощью вокодера извлекаются параметры&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{o} = \{o_1, \dots, o_N\}&amp;lt;/math&amp;gt; звуковой волны &amp;lt;math&amp;gt;\textbf{x} = \{x_1, \dots, x_T\}&amp;lt;/math&amp;gt; и лингвистические данные &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; из текста &amp;lt;math&amp;gt;W&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;&lt;br /&gt;
соответствуют параметрам вокодера и количеству сигналов звуковой волны. Затем, генеративная модель, например, [[Марковская цепь|скрытая марковская цепь]],&lt;br /&gt;
[[Нейронные сети, перцептрон#Сети прямого распространения|нейронная сеть прямого распространения]] или [[Рекуррентные нейронные сети|рекуррентная нейронная сеть]], обучается по выделенным параметрам &amp;lt;math&amp;gt;\textbf{o}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;, получая&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{\Lambda} = \arg\max\limits_{\Lambda}p(\textbf{o} | l, \Lambda)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\hat{\Lambda}&amp;lt;/math&amp;gt; - параметры модели. На этапе синтеза, модель генерирует наиболее правдоподобные параметры вокодера как&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{\textbf{o}} = \arg\max\limits_{\textbf{o}}p(\textbf{o} | l, \hat{\Lambda})&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Выходная звуковая волна моделируется с помощью вокодера и параметров &amp;lt;math&amp;gt;\hat{\textbf{o}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
== Алгоритмы, основанные на нейронных сетях ==&lt;br /&gt;
=== WaveNet ===&lt;br /&gt;
[[Файл:dilated-causal-convolutions.png|thumb|300px| [https://arxiv.org/abs/1609.03499/ Рисунок 1 — строение причинной сверточной сети (сверху) и расширенной причинной сверточной сети (снизу)]]]&lt;br /&gt;
WaveNet является генеративной моделью, использующей параметрический подход к синтезу речи. Её задача -- восстановить распределение вероятности звукового сигнала&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{x} = \{x_1, x_2, \dots, x_T\}&amp;lt;/math&amp;gt; с помощью произведения условных вероятностей&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\textbf{x})=\prod\limits_{t=1}^{T} p(x_t | x_1, x_2, \dots, x_t)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, вероятность каждого сигнала &amp;lt;math&amp;gt;x_t&amp;lt;/math&amp;gt; зависит от вероятностей предыдущих сигналов. При этом, в качестве вокодера используется преобразование, известное&lt;br /&gt;
как мю-закон &amp;lt;ref name=&amp;quot;mu law&amp;quot;&amp;gt;[http://www.itu.int/rec/dologin_pub.asp?lang=e&amp;amp;id=T-REC-G.711-198811-I!!PDF-E&amp;amp;type=items/ &amp;quot;ITU-T Recommendation G.711&amp;quot;]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(x_t) = sign(x_t) \frac{\ln(1+\mu|x_t)}{\ln(1+\mu)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\mu = 255&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1 &amp;lt; x_t &amp;lt; 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Модель представляет собой множество слоев сверточной нейронной сети, аналогично модели [[PixelRNN_и_PixelCNN | PixelCNN]].&lt;br /&gt;
Сеть не содержит уровней пулинга и выходной вектор имеет размерность, равную размерности входного вектора.&lt;br /&gt;
Выходом модели является категориальное распределение вероятности, получаемое с помощью softmax-преобразования.&lt;br /&gt;
&lt;br /&gt;
Основной идеей модели является использование причинных сверточных сетей и [[Сверточные нейронные сети#Расширенная свертка (aнгл. Dilated convolution) | расширенных ]] причинных сверточных сетей.&lt;br /&gt;
Причинная сверточная сеть представляет собой несколько уровней сверточной нейронной сети, связанных между собой в порядке, который не нарушает последовательность&lt;br /&gt;
входного сигнала, т.е. оцениваемая в момент времени &amp;lt;math&amp;gt;t+1&amp;lt;/math&amp;gt; вероятность сигнала &amp;lt;math&amp;gt;p(x_{t+1} | x_1, x_2, \dots, x_t)&amp;lt;/math&amp;gt; не зависит от сигналов&lt;br /&gt;
в последующие моменты времени &amp;lt;math&amp;gt;t+2, t+3, \dots, T&amp;lt;/math&amp;gt;. Во время обучения сети, известные сигналы из обучающих данных подаются на вход сети одновременно. На этапе генерации&lt;br /&gt;
сигналы на вход модели подаются последовательно: каждый сгенерированный моделью сигнал подается обратно на вход для генерации последующего. Причинные сверточные сети обучаются&lt;br /&gt;
быстрее, чем рекуррентные нейронные сети, но требуют достаточно большого количества уровней для обеспечивания большого окна восприятия сигнала.&lt;br /&gt;
&lt;br /&gt;
Модификация причинных сверточных сетей, называемая расширенные причинные сверточные сети, способна увеличить окно восприятия сигнала в разы и является основной идеей модели WaveNet.&lt;br /&gt;
Основная идея модификации заключается в применении свертки к области размерности большей, чем её длина, пропуская входные связи с некоторым шагом. Данный подход аналогичен применению&lt;br /&gt;
пулинга или свертки с шагом большим единицы, но результирует в выходную последовательность той же размерности. Расширенные причинные сверточные сети способны достигать большего окна&lt;br /&gt;
восприятия сигнала, используя меньшее количество уровней, при этом сохраняя вычислительную сложность причинных сверточных сетей.&lt;br /&gt;
&lt;br /&gt;
Самый известный пример применения WaveNet для синтеза речи является  технология Google Ассистент, которая использовала WaveNet для генерации голосов ассистентов на различных&lt;br /&gt;
языках. Модель позволила значительно сократить количество записей речи актеров озвучки, требуемых для создания голосовой модели&amp;lt;ref name=&amp;quot;cnet wavenet&amp;quot;&amp;gt;Martin, Taylor (May 9, 2018).[https://www.cnet.com/how-to/how-to-get-all-google-assistants-new-voices-right-now/  &amp;quot;Try the all-new Google Assistant voices right now&amp;quot;]. CNET.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
=== Tacotron ===&lt;br /&gt;
[[Файл:Tacotron.PNG|thumb|300px| [https://arxiv.org/abs/1703.10135/ Рисунок 2 — строение модели Tacotron]]]&lt;br /&gt;
[[Файл:Tacotron-cbhg.PNG|thumb|300px| [https://arxiv.org/abs/1703.10135/ Рисунок 3 — строение модуля CBHG модели Tacotron]]]&lt;br /&gt;
Tacotron - модель параметрического синтеза речи, основанная на подходе [[Механизм внимания | seq2seq]], разработанная Google и опубликованная в 2017 году. Модель состоит из кодера, декодера с [[Механизм внимания | вниманием]] и нейронной сети для&lt;br /&gt;
пост-процессинга сигнала.&lt;br /&gt;
&lt;br /&gt;
Кодер и сеть пост-процессинга опираются на блок CBHG, который состоит из набора одномерных сверточных фильтров, за которыми следуют&lt;br /&gt;
шоссейные нейронные сети&amp;lt;ref&amp;gt;Rupesh Kumar Srivastava, Klaus Greff, and J ̈urgen Schmidhuber. Highway networks. [https://arxiv.org/abs/1505.00387/ arXiv:1505.00387], 2015.&amp;lt;/ref&amp;gt;, являющиеся модификацией [[Долгая краткосрочная память | LSTM сетей]], и двунаправленный [[Рекуррентные нейронные сети#Управляемые рекуррентные блоки | управляемый рекуррентный блок]]. Входная последовательность сначала обрабатывается &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;&lt;br /&gt;
наборами сверточных фильтров с размерностью &amp;lt;math&amp;gt;1, 2, \dots, K&amp;lt;/math&amp;gt;. Эти фильтры моделируют локальную и контекстно-зависимую информацию (по аналоогии с моделированием униграмм,&lt;br /&gt;
биграмм, вплоть до &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;-грамм). Выход сверточного уровня далее обрабатывается шоссейной сетью для дальнейшего выделения параметров. В конце CBHG&lt;br /&gt;
используется управляемый рекуррентный блок для выделения параметров, опираясь на контекст перед рассматриваемым символом и после рассматриваемого символа.&lt;br /&gt;
&lt;br /&gt;
Задача кодера заключается в извлечении последовательных параметров из текста. Его входом является последовательность символов, в которой каждый символ был закодирован one-hot&lt;br /&gt;
кодированием и объединен в единый непрерывный вектор. К данному входу применяется ряд нелинейных преобразований в виде сети с узким местом (bottleneck layer), что позволяет улучшить&lt;br /&gt;
обобщаемость сети и ускорить сходимость. Модуль CBHG преобразует выход нелинейных преобразований в итоговую презентацию текста, которая передается в декодер.&lt;br /&gt;
&lt;br /&gt;
Декодер является рекуррентной нейронной сетью с вниманием, в которой запрос внимания генерируется каждый временной промежуток. Вектор контекста соединяется с выходом ячейки внимания&lt;br /&gt;
и подается на вход декодирующим рекуррентным нейронным сетям, которые являются управляемыми рекуррентными блоками. Выходом декодера является спектрограмма звуковой волны, которая&lt;br /&gt;
передается сети пост-обработки для генерации непосредственно звуковой волны.&lt;br /&gt;
&lt;br /&gt;
В качестве сети пост-обработки используется модуль CBHG, описанный ранее. После этого спектрограмма звуковой волны передается на вход алгоритму Гриффина-Лима&amp;lt;ref name=&amp;quot;griffin-lim&amp;quot;&amp;gt;D. Griffin and Jae Lim, &amp;quot;Signal estimation from modified short-time Fourier transform,&amp;quot; ICASSP '83. IEEE International Conference on Acoustics, Speech, and Signal Processing, Boston, Massachusetts, USA, 1983, pp. 804-807, doi: 10.1109/ICASSP.1983.1172092.&amp;lt;/ref&amp;gt;, который способен с&lt;br /&gt;
помощью спектрограммы восстановить исходную волну используя быстрое преобразование Фурье.&lt;br /&gt;
&lt;br /&gt;
== Проблемы ==&lt;br /&gt;
=== Задача обработки текста === &lt;br /&gt;
Алгоритмы обработки текста могут не справляться с обработкой определенных частей речи, таких, как аббревиатуры, числа и гетеронимы. Произношение определенных слов также зависит от контекста их применения. Большинство систем синтеза речи по тексту не способны выделять контекст предложений и используют различные эвристические подходы с целью различить омографы (слова с одинаковым написанием, но различным произношением).&lt;br /&gt;
=== Преобразование текста в фонемы ===&lt;br /&gt;
Процесс преобразования текста в фонемы обычно подразделяется на два подхода - словарный и основанный на правилах. Словарный подход использует словарь с записанными фонетическими представлениями слов и в процессе работы производит поиск в нем с целью конвертации слова в последовательность фонем. Основанный на правилах подход использует набор правил, которые применяются к словам или частям слов с целью выделения фонем. Оба эти подхода имеют существенные недостатки и требуют решения соответствующих проблем.&lt;br /&gt;
=== Оценка качества ===&lt;br /&gt;
На данный момент не существует единых критериев оценки качества синтезаторов речи. В каждом отдельном применении технологии синтеза речи могут быть в том числе свои критерии качества, связанные с предметной областью или используемым оборудованием. С другой стороны, ряд исследователей начали оценивать синтезаторы речи используя распространенные наборы данных для синтеза речи &amp;lt;ref&amp;gt;[http://festvox.org/blizzard/ Blizzard Challenge]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
== См. также ==&lt;br /&gt;
&lt;br /&gt;
* [[Нейронные сети, перцептрон ]]&lt;br /&gt;
* [[Сверточные нейронные сети ]]&lt;br /&gt;
* [[ Рекуррентные нейронные сети ]]&lt;br /&gt;
* [[ Механизм внимания ]]&lt;br /&gt;
* [[ Распознавание речи ]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&lt;br /&gt;
* Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Tacotron-cbhg.PNG&amp;diff=78164</id>
		<title>Файл:Tacotron-cbhg.PNG</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Tacotron-cbhg.PNG&amp;diff=78164"/>
				<updated>2021-01-13T14:42:56Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: VerlorenMind загрузил новую версию Файл:Tacotron-cbhg.PNG&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Схема модуля CBHG модели Tacotron&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Tacotron.PNG&amp;diff=78160</id>
		<title>Файл:Tacotron.PNG</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Tacotron.PNG&amp;diff=78160"/>
				<updated>2021-01-13T14:34:16Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: VerlorenMind загрузил новую версию Файл:Tacotron.PNG&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Схема модели Tacotron&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Dilated-causal-convolutions.png&amp;diff=78158</id>
		<title>Файл:Dilated-causal-convolutions.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Dilated-causal-convolutions.png&amp;diff=78158"/>
				<updated>2021-01-13T14:25:05Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: VerlorenMind загрузил новую версию Файл:Dilated-causal-convolutions.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Строение причинных сверточных нейронных сетей (сверху) и строение расширенных причинных сверточных нейронных сетей (снизу).&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B8%D0%BD%D1%82%D0%B5%D0%B7_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=78152</id>
		<title>Синтез речи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B8%D0%BD%D1%82%D0%B5%D0%B7_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=78152"/>
				<updated>2021-01-13T13:56:19Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: Добавлен раздел про Tacotron и изображения различных моделей&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}[[Категория:Машинное обучение]]&lt;br /&gt;
'''Синтез речи''' (англ. speech synthesis) - процесс генерации компьютером человеческой речи. Компьютерная система, способная к синтезу речи, называется речевым синтезатором.&lt;br /&gt;
Система, генерирующая человеческую речь, основываясь на тексте, называется '''text-to-speech''' системой (сокр. TTS).&lt;br /&gt;
&lt;br /&gt;
Процесс человеческой речи сначала транслирует некоторый текст или мысленный концепт в движение мышц, связанных с органами дыхания и речи. Затем, используя поток воздуха из легких,&lt;br /&gt;
производится генерация акустического сигнала, который содержит как периодические компоненты (созданные с помощьью вибрации органов речи), так и апериодические&lt;br /&gt;
(созданные окружающей средой и фоновым шумом). Используя изменяющиеся во времени сокращения мышц, меняются частотные характеристики акустического сигнала.&lt;br /&gt;
Задача систем генерации речи по тексту - симулировать данный процесс в каком-либо виде.&lt;br /&gt;
&lt;br /&gt;
== Этапы синтеза речи ==&lt;br /&gt;
Системы синтеза речи по тексту, как правило, можно разделить на два этапа, за которые отвечают два отдельных компонента - обработка текста и синтез речи.&lt;br /&gt;
&lt;br /&gt;
Первый этап обычно содержит несколько этапов [[Обработка естественного языка|обработки естественного языка]], такие, как разбиение  на предложения, разбиение на слова, нормализация текста,&lt;br /&gt;
автоматическая морфологическая разметка, и конвертация графем в фонемы (англ. grapheme-to-phoneme conversion, G2P).&lt;br /&gt;
Данный этап принимает в качестве входных параметров текст и возвращает последовательность фонем с различными выделенными лингвистическими особенностями.&lt;br /&gt;
&lt;br /&gt;
Этап синтеза речи, в свою очередь, принимает на вход последовательность фонем и возвращает синтезированную звуковую волну речи.&lt;br /&gt;
Данный этап обычно включает в себя алгоритмы предсказания просодии и алгоритмы генерации звуковых волн речи, а так же может содержать&lt;br /&gt;
вокодер (англ. voice encoder) - алгоритм или устройство,&lt;br /&gt;
способное выделить из звуковой волны определенные параметры и затем использовать её для генерации похожей волны.&lt;br /&gt;
&lt;br /&gt;
== Классы подходов к синтезу речи ==&lt;br /&gt;
Основными требованиями к технологиям синтеза речи являются естественность (англ. naturalness) и разборчивость (англ. intelligibility).&lt;br /&gt;
Естественность описывает, насколько генерируемая речь близка к человеческой, а разборчивость отражает, насколько сложно понять речь.&lt;br /&gt;
Идеальный синтезатор речи генерирует одновременно и натуральную, и разборчивую речь.&lt;br /&gt;
=== Конкатенативный синтез ===&lt;br /&gt;
'''Конкатенативный синтез''' (англ. concatenative synthesis) основывается на конкатенации предварительно записанных примеров человеческой речи в единую звуковую последовательность. Данный подход генерирует наиболее естественную речь, но генерируемая речь часто содержит значительные отличия и ошибки по сравнению с человеческой речью.&lt;br /&gt;
&lt;br /&gt;
'''Синтез с выбором''' (англ. unit selection synthesis) является самым используемым подходом конкатенативного синтеза и использует большую базу данных записанной речи. При создании базы данных, записанные фразы могут делиться на различные звуковые единицы, такие, как фоны, дифоны, полуфоны, слоги, морфемы, целые фразы или предложения. При запуске, алгоритм генерирует выходную звуковую волну с помощью выбора наилучшей последовательности звуковых единиц из базы данных. Данный выбор обычно реализован с помощью [[Дерево решений и случайный лес|дерева решений]].&lt;br /&gt;
Данный подход обеспечивает наиболее естественную речь, так как использует минимальную цифровую обработку сигналов. Недостатком подхода является необходимость в довольно большой базе данных звуков для достижения наибольшей естественности речи.&lt;br /&gt;
&lt;br /&gt;
'''Дифонный синтез''' (англ. diphone synthesis) является частным случаем синтеза с выбором, который использует в качестве звуковых единиц дифоны (переход от звука к звуку). Подход использует только один образец каждого дифона. База данных дифонов при этом получается сравнительно небольшой. Например, немецкий язык содержит около 800 дифонов, а испанский - около 2500. При работе алгоритма просодия входной последовательности накладывается на дифоны в базе данных с помощью различных алгоритмов цифровой обработки сигналов. Данный алгоритм значительно уступает по качеству другим подходам и, кроме меньшего размера базы данных, не дает весомых преимуществ.&lt;br /&gt;
&lt;br /&gt;
'''Синтез речи, ограниченный предметной областью''' (англ. domain-specific speech synthesis) также является частным случаем синтеза с выбором и использует базу данных предварительно записанных слов, фраз и предложений для составления выходной последовательности. Он используется в задачах, где вариативность и размер используемых фраз ограничены некоторой предметной областью, например, прогнозирование погоды или составление расписания транспорта. Из-за значительной простоты реализации и использования данный подход уже долго применяется в коммерческих продуктах, например, говорящие часы или калькуляторы. При этом данный подход может обеспечивать высокую естественность речи вследствие ограниченности используемой базы данных. Недостатками таких систем является ограниченность областью применимости и неспособность учитывать контекст речи, что может вызывать ощутимые ошибки в некоторых языках.&lt;br /&gt;
&lt;br /&gt;
=== Параметрический синтез ===&lt;br /&gt;
Параметрический синтез (англ. statistical parametrical synthesis) для генерации выходной звуковой волны, в отличии от конкатенативного синтеза, не использует реальные примеры речи, а строит вероятностное распределение некоторых параметров и акустических свойств звуковой волны.&lt;br /&gt;
В начале работы параметрического синтезатора с помощью вокодера извлекаются параметры&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{o} = \{o_1, \dots, o_N\}&amp;lt;/math&amp;gt; звуковой волны &amp;lt;math&amp;gt;\textbf{x} = \{x_1, \dots, x_T\}&amp;lt;/math&amp;gt; и лингвистические данные &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; из текста &amp;lt;math&amp;gt;W&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;&lt;br /&gt;
соответствуют параметрам вокодера и количеству сигналов звуковой волны. Затем, генеративная модель, например, [[Марковская цепь|скрытая марковская цепь]],&lt;br /&gt;
[[Нейронные сети, перцептрон#Сети прямого распространения|нейронная сеть прямого распространения]] или [[Рекуррентные нейронные сети|рекуррентная нейронная сеть]], обучается по выделенным параметрам &amp;lt;math&amp;gt;\textbf{o}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;, получая&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{\Lambda} = \arg\max\limits_{\Lambda}p(\textbf{o} | l, \Lambda)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\hat{\Lambda}&amp;lt;/math&amp;gt; - параметры модели. На этапе синтеза, модель генерирует наиболее правдоподобные параметры вокодера как&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{\textbf{o}} = \arg\max\limits_{\textbf{o}}p(\textbf{o} | l, \hat{\Lambda})&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Выходная звуковая волна моделируется с помощью вокодера и параметров &amp;lt;math&amp;gt;\hat{\textbf{o}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
== Алгоритмы, основанные на нейронных сетях ==&lt;br /&gt;
=== WaveNet ===&lt;br /&gt;
[[Файл:dilated-causal-convolutions.png|thumb|300px| [https://arxiv.org/abs/1609.03499/ Рисунок 1 — строение причинной сверточной сети (сверху) и расширенной причинной сверточной сети (снизу)]]]&lt;br /&gt;
WaveNet является генеративной моделью, использующей параметрический подход к синтезу речи. Её задача -- восстановить распределение вероятности звукового сигнала&lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{x} = \{x_1, x_2, \dots, x_T\}&amp;lt;/math&amp;gt; с помощью произведения условных вероятностей&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\textbf{x}=\prod\limits_{t=1}^{T} p(x_t | x_1, x_2, \dots, x_t)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, вероятность каждого сигнала &amp;lt;math&amp;gt;x_t&amp;lt;/math&amp;gt; зависит от вероятностей предыдущих сигналов. При этом, в качестве вокодера используется преобразование, известное&lt;br /&gt;
как мю-закон &amp;lt;ref name=&amp;quot;mu law&amp;quot;&amp;gt;[http://www.itu.int/rec/dologin_pub.asp?lang=e&amp;amp;id=T-REC-G.711-198811-I!!PDF-E&amp;amp;type=items/ &amp;quot;ITU-T Recommendation G.711&amp;quot;]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(x_t) = sign(x_t) \frac{\ln(1+\mu|x_t)}{\ln(1+\mu)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\mu = 255&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1 &amp;lt; x_t &amp;lt; 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Модель представляет собой множество слоев сверточной нейронной сети, аналогично модели [[PixelRNN_и_PixelCNN | PixelCNN]].&lt;br /&gt;
Сеть не содержит уровней пулинга и выходной вектор имеет размерность, равную размерности входного вектора.&lt;br /&gt;
Выходом модели является категориальное распределение вероятности, получаемое с помощью softmax-преобразования.&lt;br /&gt;
&lt;br /&gt;
Основной идеей модели является использование причинных сверточных сетей и расширенных причинных сверточных сетей.&lt;br /&gt;
Причинная сверточная сеть представляет собой несколько уровней сверточной нейронной сети, связанных между собой в порядке, который не нарушает последовательность&lt;br /&gt;
входного сигнала, т.е. оцениваемая в момент времени &amp;lt;math&amp;gt;t+1&amp;lt;/math&amp;gt; вероятность сигнала &amp;lt;math&amp;gt;p(x_{t+1} | x_1, x_2, \dots, x_t)&amp;lt;/math&amp;gt; не зависит от сигналов&lt;br /&gt;
в последующие моменты времени &amp;lt;math&amp;gt;t+2, t+3, \dots, T&amp;lt;/math&amp;gt;. Во время обучения сети, известные сигналы из обучающих данных подаются на вход сети одновременно. На этапе генерации&lt;br /&gt;
сигналы на вход модели подаются последовательно: каждый сгенерированный моделью сигнал подается обратно на вход для генерации последующего. Причинные сверточные сети обучаются&lt;br /&gt;
быстрее, чем рекуррентные нейронные сети, но требуют достаточно большого количества уровней для обеспечивания большого окна восприятия сигнала.&lt;br /&gt;
&lt;br /&gt;
Модификация причинных сверточных сетей, называемая расширенные причинные сверточные сети, способна увеличить окно восприятия сигнала в разы и является основной идеей модели WaveNet.&lt;br /&gt;
Основная идея модификации заключается в применении свертки к области размерности большей, чем её длина, пропуская входные связи с некоторым шагом. Данный подход аналогичен применению&lt;br /&gt;
пулинга или свертки с шагом большим единицы, но результирует в выходную последовательность той же размерности. Расширенные причинные сверточные сети способны достигать большего окна&lt;br /&gt;
восприятия сигнала, используя меньшее количество уровней, при этом сохраняя вычислительную сложность причинных сверточных сетей.&lt;br /&gt;
&lt;br /&gt;
Самый известный пример применения WaveNet для синтеза речи является  технология Google Ассистент, которая использовала WaveNet для генерации голосов ассистентов на различных&lt;br /&gt;
языках. Модель позволила значительно сократить количество записей речи актеров озвучки, требуемых для создания голосовой модели&amp;lt;ref name=&amp;quot;cnet wavenet&amp;quot;&amp;gt;Martin, Taylor (May 9, 2018).[https://www.cnet.com/how-to/how-to-get-all-google-assistants-new-voices-right-now/  &amp;quot;Try the all-new Google Assistant voices right now&amp;quot;]. CNET.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
=== Tacotron ===&lt;br /&gt;
[[Файл:Tacotron.PNG|thumb|300px| [https://arxiv.org/abs/1703.10135/ Рисунок 2 — строение модели Tacotron]]]&lt;br /&gt;
[[Файл:Tacotron-cbhg.PNG|thumb|300px| [https://arxiv.org/abs/1703.10135/ Рисунок 3 — строение модуля CBHG модели Tacotron]]]&lt;br /&gt;
Tacotron - модель параметрического синтеза речи, основанная на подходе [[Механизм внимания | seq2seq]], разработанная Google и опубликованная в 2017 году. Модель состоит из кодера, декодера с [[Механизм внимания | вниманием]] и нейронной сети для&lt;br /&gt;
пост-процессинга сигнала.&lt;br /&gt;
&lt;br /&gt;
Кодер и сеть пост-процессинга опираются на блок CBHG, который состоит из набора одномерных сверточных фильтров, за которыми следуют&lt;br /&gt;
шоссейные нейронные сети&amp;lt;ref&amp;gt;Rupesh Kumar Srivastava, Klaus Greff, and J ̈urgen Schmidhuber. Highway networks. [https://arxiv.org/abs/1505.00387/ arXiv:1505.00387], 2015.&amp;lt;/ref&amp;gt;, являющиеся модификацией [[Долгая краткосрочная память | LSTM сетей]], и двунаправленный [[Рекуррентные нейронные сети#Управляемые рекуррентные блоки | управляемый рекуррентный блок]]. Входная последовательность сначала обрабатывается &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;&lt;br /&gt;
наборами сверточных фильтров с размерностью &amp;lt;math&amp;gt;1, 2, \dots, K&amp;lt;/math&amp;gt;. Эти фильтры моделируют локальную и контекстно-зависимую информацию (по аналоогии с моделированием униграмм,&lt;br /&gt;
биграмм, вплоть до &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;-грамм). Выход сверточного уровня далее обрабатывается шоссейной сетью для дальнейшего выделения параметров. В конце CBHG&lt;br /&gt;
используется управляемый рекуррентный блок для выделения параметров, опираясь на контекст перед рассматриваемым символом и после рассматриваемого символа.&lt;br /&gt;
&lt;br /&gt;
Задача кодера заключается в извлечении последовательных параметров из текста. Его входом является последовательность символов, в которой каждый символ был закодирован one-hot&lt;br /&gt;
кодированием и объединен в единый непрерывный вектор. К данному входу применяется ряд нелинейных преобразований в виде сети с узким местом (bottleneck layer), что позволяет улучшить&lt;br /&gt;
обобщаемость сети и ускорить сходимость. Модуль CBHG преобразует выход нелинейных преобразований в итоговую презентацию текста, которая передается в декодер.&lt;br /&gt;
&lt;br /&gt;
Декодер является рекуррентной нейронной сетью с вниманием, в которой запрос внимания генерируется каждый временной промежуток. Вектор контекста соединяется с выходом ячейки внимания&lt;br /&gt;
и подается на вход декодирующим рекуррентным нейронным сетям, которые являются управляемыми рекуррентными блоками. Выходом декодера является спектрограмма звуковой волны, которая&lt;br /&gt;
передается сети пост-обработки для генерации непосредственно звуковой волны.&lt;br /&gt;
&lt;br /&gt;
В качестве сети пост-обработки используется модуль CBHG, описанный ранее. После этого спектрограмма звуковой волны передается на вход алгоритму Гриффина-Лима&amp;lt;ref name=&amp;quot;griffin-lim&amp;quot;&amp;gt;D. Griffin and Jae Lim, &amp;quot;Signal estimation from modified short-time Fourier transform,&amp;quot; ICASSP '83. IEEE International Conference on Acoustics, Speech, and Signal Processing, Boston, Massachusetts, USA, 1983, pp. 804-807, doi: 10.1109/ICASSP.1983.1172092.&amp;lt;/ref&amp;gt;, который способен с&lt;br /&gt;
помощью спектрограммы восстановить исходную волну используя быстрое преобразование Фурье.&lt;br /&gt;
&lt;br /&gt;
== Проблемы ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
&lt;br /&gt;
* [[Нейронные сети, перцептрон]]&lt;br /&gt;
* [[Сверточные нейронные сети]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, &amp;amp; Koray Kavukcuoglu. (2016). WaveNet: A Generative Model for Raw Audio. [https://arxiv.org/abs/1609.03499/ arXiv:1609.03499]&lt;br /&gt;
* Yuxuan Wang, RJ Skerry-Ryan, Daisy Stanton, Yonghui Wu, Ron J. Weiss, Navdeep Jaitly, Zongheng Yang, Ying Xiao, Zhifeng Chen, Samy Bengio, Quoc Le, Yannis Agiomyrgiannakis, Rob Clark, &amp;amp; Rif A. Saurous. (2017). Tacotron: Towards End-to-End Speech Synthesis. [https://arxiv.org/abs/1703.10135/ arXiv:1703.10135]&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Tacotron-cbhg.PNG&amp;diff=78140</id>
		<title>Файл:Tacotron-cbhg.PNG</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Tacotron-cbhg.PNG&amp;diff=78140"/>
				<updated>2021-01-13T13:12:52Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: Схема модуля CBHG модели Tacotron&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Схема модуля CBHG модели Tacotron&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Tacotron.PNG&amp;diff=78139</id>
		<title>Файл:Tacotron.PNG</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Tacotron.PNG&amp;diff=78139"/>
				<updated>2021-01-13T13:12:21Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: Схема модели Tacotron&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Схема модели Tacotron&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Dilated-causal-convolutions.png&amp;diff=78138</id>
		<title>Файл:Dilated-causal-convolutions.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Dilated-causal-convolutions.png&amp;diff=78138"/>
				<updated>2021-01-13T13:10:35Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: Строение причинных сверточных нейронных сетей (сверху) и строение расширенных причинных сверточных нейронных сетей (снизу).&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Строение причинных сверточных нейронных сетей (сверху) и строение расширенных причинных сверточных нейронных сетей (снизу).&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B8%D0%BD%D1%82%D0%B5%D0%B7_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=77887</id>
		<title>Синтез речи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B8%D0%BD%D1%82%D0%B5%D0%B7_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=77887"/>
				<updated>2021-01-12T14:13:26Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: Добавлен раздел про WaveNet&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}[[Категория:Машинное обучение]]&lt;br /&gt;
'''Синтез речи''' (англ. speech synthesis) - процесс генерации компьютером человеческой речи. Компьютерная система, способная к синтезу речи, называется речевым синтезатором. &lt;br /&gt;
Система, генерирующая человеческую речь, основываясь на тексте, называется '''text-to-speech''' системой (сокр. TTS).&lt;br /&gt;
&lt;br /&gt;
Процесс человеческой речи сначала транслирует некоторый текст или мысленный концепт в движение мышц, связанных с органами дыхания и речи. Затем, используя поток воздуха из легких,&lt;br /&gt;
производится генерация акустического сигнала, который содержит как периодические компоненты (созданные с помощьью вибрации органов речи), так и апериодические &lt;br /&gt;
(созданные окружающей средой и фоновым шумом). Используя изменяющиеся во времени сокращения мышц, меняются частотные характеристики акустического сигнала. &lt;br /&gt;
Задача систем генерации речи по тексту - симулировать данный процесс в каком-либо виде. &lt;br /&gt;
&lt;br /&gt;
== Этапы синтеза речи ==&lt;br /&gt;
Системы синтеза речи по тексту, как правило, можно разделить на два этапа, за которые отвечают два отдельных компонента - обработка текста и синтез речи. &lt;br /&gt;
&lt;br /&gt;
Первый этап обычно содержит несколько этапов [[Обработка естественного языка|обработки естественного языка]], такие, как разбиение  на предложения, разбиение на слова, нормализация текста, &lt;br /&gt;
автоматическая морфологическая разметка, и конвертация графем в фонемы (англ. grapheme-to-phoneme conversion, G2P). &lt;br /&gt;
Данный этап принимает в качестве входных параметров текст и возвращает последовательность фонем с различными выделенными лингвистическими особенностями.&lt;br /&gt;
&lt;br /&gt;
Этап синтеза речи, в свою очередь, принимает на вход последовательность фонем и возвращает синтезированную звуковую волну речи. &lt;br /&gt;
Данный этап обычно включает в себя алгоритмы предсказания просодии и алгоритмы генерации звуковых волн речи, а так же может содержать &lt;br /&gt;
вокодер (англ. voice encoder) - алгоритм или устройство, &lt;br /&gt;
способное выделить из звуковой волны определенные параметры и затем использовать её для генерации похожей волны.&lt;br /&gt;
&lt;br /&gt;
== Классы подходов к синтезу речи ==&lt;br /&gt;
Основными требованиями к технологиям синтеза речи являются естественность (англ. naturalness) и разборчивость (англ. intelligibility). &lt;br /&gt;
естественность описывает, насколько генерируемая речь близка к человеческой, а разборчивость отражает, насколько сложно понять речь. &lt;br /&gt;
Идеальный синтезатор речи генерирует одновременно и натуральную, и разборчивую речь.&lt;br /&gt;
=== Конкатенативный синтез ===&lt;br /&gt;
'''Конкатенативный синтез''' (англ. concatenative synthesis) основывается на конкатенации предварительно записанных примеров человеческой речи в единую звуковую последовательность. Данный подход генерирует наиболее естественную речь, но генерируемая речь часто содержит значительные отличия и ошибки по сравнению с человеческой речью. &lt;br /&gt;
&lt;br /&gt;
'''Синтез с выбором''' (англ. unit selection synthesis) является самым используемым подходом конкатенативного синтеза и использует большую базу данных записанной речи. При создании базы данных, записанные фразы могут делиться на различные звуковые единицы, такие, как фоны, дифоны, полуфоны, слоги, морфемы, целые фразы или предложения. При запуске, алгоритм генерирует выходную звуковую волну с помощью выбора наилучшей последовательности звуковых единиц из базы данных. Данный выбор обычно реализован с помощью [[Дерево решений и случайный лес|дерева решений]].&lt;br /&gt;
Данный подход обеспечивает наиболее естественную речь, так как использует минимальную цифровую обработку сигналов. Недостатком подхода является необходимость в довольно большой базе данных звуков для достижения наибольшей естественности речи. &lt;br /&gt;
&lt;br /&gt;
'''Дифонный синтез''' (англ. diphone synthesis) является частным случаем синтеза с выбором, который использует в качестве звуковых единиц дифоны (переход от звука к звуку). Подход использует только один образец каждого дифона. База данных дифонов при этом получается сравнительно небольшой. Например, немецкий язык содержит около 800 дифонов, а испанский - около 2500. При работе алгоритма просодия входной последовательности накладывается на дифоны в базе данных с помощью различных алгоритмов цифровой обработки сигналов. Данный алгоритм значительно уступает по качеству другим подходам и, кроме меньшего размера базы данных, не дает весомых преимуществ.&lt;br /&gt;
&lt;br /&gt;
'''Синтез речи, ограниченный предметной областью''' (англ. domain-specific speech synthesis) также является частным случаем синтеза с выбором и использует базу данных предварительно записанных слов, фраз и предложений для составления выходной последовательности. Он используется в задачах, где вариативность и размер используемых фраз ограничены некоторой предметной областью, например, прогнозирование погоды или составление расписания транспорта. Из-за значительной простоты реализации и использования данный подход уже долго применяется в коммерческих продуктах, например, говорящие часы или калькуляторы. При этом данный подход может обеспечивать высокую естественность речи вследствие ограниченности используемой базы данных. Недостатками таких систем является ограниченность областью применимости и неспособность учитывать контекст речи, что может вызывать ощутимые ошибки в некоторых языках.&lt;br /&gt;
&lt;br /&gt;
=== Параметрический синтез ===&lt;br /&gt;
Параметрический синтез (англ. statistical parametrical synthesis) для генерации выходной звуковой волны, в отличии от конкатенативного синтеза, не использует реальные примеры речи, а строит вероятностное распределение некоторых параметров и акустических свойств звуковой волны.&lt;br /&gt;
В начале работы параметрического синтезатора с помощью вокодера извлекаются параметры  &lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{o} = \{o_0, o_1, \dots, o_N\}&amp;lt;/math&amp;gt; звуковой волны &amp;lt;math&amp;gt;\textbf{x} = \{x_0, o_x, \dots, o_T\}&amp;lt;/math&amp;gt; и лингвистические данные &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; из текста &amp;lt;math&amp;gt;W&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; &lt;br /&gt;
соответствуют параметрам вокодера и количеству сигналов звуковой волны. Затем, генеративная модель, например, [[Марковская цепь|скрытая марковская цепь]], &lt;br /&gt;
[[Нейронные сети, перцептрон#Сети прямого распространения|нейронная сеть прямого распространения]] или [[Рекуррентные нейронные сети|рекуррентная нейронная сеть]], обучается по выделенным параметрам &amp;lt;math&amp;gt;\textbf{o}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;, получая&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{\Lambda} = \arg\max\limits_{\Lambda}p(\textbf{o} | l, \Lambda)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\hat{\Lambda}&amp;lt;/math&amp;gt; - параметры модели. На этапе синтеза, модель генерирует наиболее правдоподобные параметры вокодера как &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{\textbf{o}} = \arg\max\limits_{\textbf{o}}p(\textbf{o} | l, \hat{\Lambda})&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Выходная звуковая волна моделируется с помощью вокодера и параметров &amp;lt;math&amp;gt;\hat{\textbf{o}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
== Алгоритмы, основанные на нейронных сетях ==&lt;br /&gt;
=== Wavenet ===&lt;br /&gt;
Wavenet является генеративной моделью, использующей параметрический подход к синтезу речи. Её задача -- восстановить распределение вероятности звукового сигнала &lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{x} = \{x_1, x_2, \dots, x_T\}&amp;lt;/math&amp;gt; с помощью произведения условных вероятностей&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\textbf{x})=\prod\limits_{t=1}^{T} p(x_t | x_1, x_2, \dots, x_t)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, вероятность каждого сигнала &amp;lt;math&amp;gt;x_t&amp;lt;/math&amp;gt; зависит от вероятностей предыдущих сигналов.&lt;br /&gt;
Модель представляет собой множество слоев сверточной нейронной сети, аналогично модели PixelCNN. &lt;br /&gt;
Сеть не содержит уровней пулинга и выходной вектор имеет размерность, равную размерности входного вектора. &lt;br /&gt;
Выходом модели является категориальное распределение вероятности, получаемое с помощью softmax-преобразования. Значения сигнала при этом закодированы используя мю-закон:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(x_t) = sign(x_t) \frac{\ln(1+\mu|x_t)}{\ln(1+\mu)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\mu = 255&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1 &amp;lt; x_t &amp;lt; 1&amp;lt;/math&amp;gt;, и приведены к 256 уникальным значениям.&lt;br /&gt;
&lt;br /&gt;
Основной идеей модели является использование причинных сверточных сетей и расширенных причинных сверточных сетей.&lt;br /&gt;
Причинная сверточная сеть представляет собой несколько уровней сверточной нейронной сети, связанных между собой в порядке, который не нарушает последовательность&lt;br /&gt;
входного сигнала, т.е. оцениваемая в момент времени &amp;lt;math&amp;gt;t+1&amp;lt;/math&amp;gt; вероятность сигнала &amp;lt;math&amp;gt;p(x_{t+1} | x_1, x_2, \dots, x_t)&amp;lt;/math&amp;gt; не зависит от сигналов &lt;br /&gt;
в последующие моменты времени &amp;lt;math&amp;gt;t+2, t+3, \dots, T&amp;lt;/math&amp;gt;. Во время обучения сети, известные сигналы из обучающих данных подаются на вход сети одновременно. На этапе генерации&lt;br /&gt;
сигналы на вход модели подаются последовательно: каждый сгенерированный моделью сигнал подается обратно на вход для генерации последующего. Причинные сверточные сети обучаются &lt;br /&gt;
быстрее, чем рекуррентные нейронные сети, но требуют достаточно большого количества уровней для обеспечивания большого окна восприятия сигнала. &lt;br /&gt;
&lt;br /&gt;
Модификация причинных сверточных сетей, называемая расширенные причинные сверточные сети, способна увеличить окно восприятия сигнала в разы и является основной идеей модели Wavenet. &lt;br /&gt;
Основная идея модификации заключается в применении свертки к области размерности большей, чем её длина, пропуская входные связи с некоторым шагом. Данный подход аналогичен применению &lt;br /&gt;
пулинга или свертки с шагом большим единицы, но результирует в выходную последовательность той же размерности. Расширенные причинные сверточные сети способны достигать большего окна &lt;br /&gt;
восприятия сигнала, используя меньшее количество уровней, при этом сохраняя вычислительную сложность причинных сверточных сетей.&lt;br /&gt;
&lt;br /&gt;
Самый известный пример применения WaveNet для синтеза речи является  технология Google Ассистент, которая использовала WaveNet для генерации голосов ассистентов на различных &lt;br /&gt;
языках. Модель позволила значительно сократить количество записей речи актеров ощвучки, требуемых для создания голосовой модели.&lt;br /&gt;
=== Tacotron ===&lt;br /&gt;
== Проблемы ==&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
&lt;br /&gt;
* [[Нейронные сети, перцептрон]]&lt;br /&gt;
* [[Сверточные нейронные сети]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B8%D0%BD%D1%82%D0%B5%D0%B7_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=76979</id>
		<title>Синтез речи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B8%D0%BD%D1%82%D0%B5%D0%B7_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=76979"/>
				<updated>2021-01-09T14:28:51Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: Первая версия статьи с обзором основных подходов&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}[[Категория:Машинное обучение]]&lt;br /&gt;
'''Синтез речи''' (англ. speech synthesis) - процесс генерации компьютером человеческой речи. Компьютерная система, способная к синтезу речи, называется речевым синтезатором. Система, генерирующая человеческую речь,&lt;br /&gt;
основываясь на тексте, называется '''text-to-speech''' системой (сокр. TTS).&lt;br /&gt;
&lt;br /&gt;
Процесс человеческой речи сначала транслирует некоторый текст или мысленный концепт в движение мышц, связанных с органами дыхания и речи. Затем, используя поток воздуха из легких,&lt;br /&gt;
производится генерация акустического сигнала, который содержит как периодические компоненты (созданные с помощьью вибрации органов речи), так и апериодические &lt;br /&gt;
(созданные окружающей средой и фоновым шумом). Используя изменяющиеся во времени сокращения мышц, меняются частотные характеристики акустического сигнала. &lt;br /&gt;
Задача систем генерации речи по тексту - симулировать данный процесс в каком-либо виде. &lt;br /&gt;
&lt;br /&gt;
== Этапы синтеза речи ==&lt;br /&gt;
Системы синтеза речи по тексту, как правило, можно разделить на два этапа, за которые отвечают два отдельных компонента - обработка текста и синтез речи. &lt;br /&gt;
&lt;br /&gt;
Первый этап обычно содержит несколько этапов [[Обработка естественного языка|обработки естественного языка]], такие, как разбиение  на предложения, разбиение на слова, нормализация текста, &lt;br /&gt;
автоматическая морфологическая разметка, и конвертация графем в фонемы (англ. grapheme-to-phoneme conversion, G2P). &lt;br /&gt;
Данный этап принимает в качестве входных параметров текст и возвращает последовательность фонем с различными выделенными лингвистическими особенностями.&lt;br /&gt;
&lt;br /&gt;
Этап синтеза речи, в свою очередь, принимает на вход последовательность фонем и возвращает синтезированную звуковую волну речи. &lt;br /&gt;
Данный этап обычно включает в себя алгоритмы предсказания просодии и алгоритмы генерации звуковых волн речи, а так же может содержать &lt;br /&gt;
вокодер (англ. voice encoder) - алгоритм или устройство, &lt;br /&gt;
способное выделить из звуковой волны определенные параметры и затем использовать её для генерации похожей волны.&lt;br /&gt;
&lt;br /&gt;
== Классы подходов к синтезу речи ==&lt;br /&gt;
Основными требованиями к технологиям синтеза речи являются естественность (англ. naturalness) и разборчивость (англ. intelligibility). &lt;br /&gt;
естественность описывает, насколько генерируемая речь близка к человеческой, а разборчивость отражает, насколько сложно понять речь. &lt;br /&gt;
Идеальный синтезатор речи генерирует одновременно и натуральную, и разборчивую речь.&lt;br /&gt;
=== Конкатенативный синтез ===&lt;br /&gt;
'''Конкатенативный синтез''' (англ. concatenative synthesis) основывается на конкатенации предварительно записанных примеров человеческой речи в единую звуковую последовательность. Данный подход генерирует наиболее естественную речь, но генерируемая речь часто содержит значительные отличия и ошибки по сравнению с человеческой речью. &lt;br /&gt;
&lt;br /&gt;
'''Синтез с выбором''' (англ. unit selection synthesis) является самым используемым подходом конкатенативного синтеза и использует большую базу данных записанной речи. При создании базы данных, записанные фразы могут делиться на различные звуковые единицы, такие, как фоны, дифоны, полуфоны, слоги, морфемы, целые фразы или предложения. При запуске, алгоритм генерирует выходную звуковую волну с помощью выбора наилучшей последовательности звуковых единиц из базы данных. Данный выбор обычно реализован с помощью [[Дерево решений и случайный лес|дерева решений]].&lt;br /&gt;
Данный подход обеспечивает наиболее естественную речь, так как использует минимальную цифровую обработку сигналов. Недостатком подхода является необходимость в довольно большой базе данных звуков для достижения наибольшей естественности речи. &lt;br /&gt;
&lt;br /&gt;
'''Дифонный синтез''' (англ. diphone synthesis) является частным случаем синтеза с выбором, который использует в качестве звуковых единиц дифоны (переход от звука к звуку). Подход использует только один образец каждого дифона. База данных дифонов при этом получается сравнительно небольшой. Например, немецкий язык содержит около 800 дифонов, а испанский - около 2500. При работе алгоритма просодия входной последовательности накладывается на дифоны в базе данных с помощью различных алгоритмов цифровой обработки сигналов. Данный алгоритм значительно уступает по качеству другим подходам и, кроме меньшего размера базы данных, не дает весомых преимуществ.&lt;br /&gt;
&lt;br /&gt;
'''Синтез речи, ограниченный предметной областью''' (англ. domain-specific speech synthesis) также является частным случаем синтеза с выбором и использует базу данных предварительно записанных слов, фраз и предложений для составления выходной последовательности. Он используется в задачах, где вариативность и размер используемых фраз ограничены некоторой предметной областью, например, прогнозирование погоды или составление расписания транспорта. Из-за значительной простоты реализации и использования данный подход уже долго применяется в коммерческих продуктах, например, говорящие часы или калькуляторы. При этом данный подход может обеспечивать высокую естественность речи вследствие ограниченности используемой базы данных. Недостатками таких систем является ограниченность областью применимости и неспособность учитывать контекст речи, что может вызывать ощутимые ошибки в некоторых языках.&lt;br /&gt;
&lt;br /&gt;
=== Параметрический синтез ===&lt;br /&gt;
Параметрический синтез (англ. statistical parametrical synthesis) для генерации выходной звуковой волны, в отличии от конкатенативного синтеза, не использует реальные примеры речи, а строит вероятностное распределение некоторых параметров и акустических свойств звуковой волны.&lt;br /&gt;
В начале работы параметрического синтезатора с помощью вокодера извлекаются параметры  &lt;br /&gt;
&amp;lt;math&amp;gt;\textbf{o} = \{o_0, o_1, \dots, o_N\}&amp;lt;/math&amp;gt; звуковой волны &amp;lt;math&amp;gt;\textbf{x} = \{x_0, o_x, \dots, o_T\}&amp;lt;/math&amp;gt; и лингвистические данные &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; из текста &amp;lt;math&amp;gt;W&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; &lt;br /&gt;
соответствуют параметрам вокодера и количеству сигналов звуковой волны. Затем, генеративная модель, например, [[Марковская цепь|скрытая марковская цепь]], &lt;br /&gt;
[[Нейронные сети, перцептрон#Сети прямого распространения|нейронная сеть прямого распространения]] или [[Рекуррентные нейронные сети|рекуррентная нейронная сеть]], обучается по выделенным параметрам &amp;lt;math&amp;gt;\textbf{o}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;, получая&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{\Lambda} = \arg\max\limits_{\Lambda}p(\textbf{o} | l, \Lambda)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\hat{\Lambda}&amp;lt;/math&amp;gt; - параметры модели. На этапе синтеза, модель генерирует наиболее правдоподобные параметры вокодера как &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{\textbf{o}} = \arg\max\limits_{\textbf{o}}p(\textbf{o} | l, \hat{\Lambda})&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Выходная звуковая волна моделируется с помощью вокодера и параметров &amp;lt;math&amp;gt;\hat{\textbf{o}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
== Алгоритмы, основанные на нейронных сетях ==&lt;br /&gt;
=== Wavenet ===&lt;br /&gt;
=== Tacotron ===&lt;br /&gt;
== Проблемы ==&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
&lt;br /&gt;
* [[Нейронные сети, перцептрон]]&lt;br /&gt;
* [[Сверточные нейронные сети]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B8%D0%BD%D1%82%D0%B5%D0%B7_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=75869</id>
		<title>Синтез речи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B8%D0%BD%D1%82%D0%B5%D0%B7_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=75869"/>
				<updated>2020-12-29T13:14:42Z</updated>
		
		<summary type="html">&lt;p&gt;VerlorenMind: создана страница&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}[[Категория:Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>VerlorenMind</name></author>	</entry>

	</feed>