Buckets:
| <meta charset="utf-8" /><meta name="hf:doc:metadata" content="{"title":"Архитектуры Seq2Seq","local":"архитектуры-seq2seq","sections":[{"title":"Автоматическое распознавание речи","local":"автоматическое-распознавание-речи","sections":[],"depth":2},{"title":"Преобразование текста в речь (Text-to-speech, TTS)","local":"преобразование-текста-в-речь-text-to-speech-tts","sections":[],"depth":2},{"title":"Заключение","local":"заключение","sections":[],"depth":2}],"depth":1}"> | |
| <link href="/docs/audio-course/pr_239/ru/_app/immutable/assets/0.e3b0c442.css" rel="modulepreload"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/ru/_app/immutable/entry/start.13cec9b0.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/ru/_app/immutable/chunks/scheduler.cd324960.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/ru/_app/immutable/chunks/singletons.48cedec4.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/ru/_app/immutable/chunks/index.a0c12d66.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/ru/_app/immutable/chunks/paths.fcdbf8b6.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/ru/_app/immutable/entry/app.af2704da.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/ru/_app/immutable/chunks/preload-helper.6ae502d0.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/ru/_app/immutable/chunks/index.d5c3adcc.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/ru/_app/immutable/nodes/0.7f9b0aee.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/ru/_app/immutable/chunks/each.e59479a4.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/ru/_app/immutable/nodes/20.0043fb78.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/ru/_app/immutable/chunks/Tip.889bec11.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/ru/_app/immutable/chunks/MermaidChart.svelte_svelte_type_style_lang.00c8a5a8.js"><!-- HEAD_svelte-u9bgzb_START --><meta name="hf:doc:metadata" content="{"title":"Архитектуры Seq2Seq","local":"архитектуры-seq2seq","sections":[{"title":"Автоматическое распознавание речи","local":"автоматическое-распознавание-речи","sections":[],"depth":2},{"title":"Преобразование текста в речь (Text-to-speech, TTS)","local":"преобразование-текста-в-речь-text-to-speech-tts","sections":[],"depth":2},{"title":"Заключение","local":"заключение","sections":[],"depth":2}],"depth":1}"><!-- HEAD_svelte-u9bgzb_END --> <p></p> <div class="items-center shrink-0 min-w-[100px] max-sm:min-w-[50px] justify-end ml-auto flex" style="float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"><div class="inline-flex rounded-md max-sm:rounded-sm"><button class="inline-flex items-center gap-1 h-7 max-sm:h-7 px-2 max-sm:px-1.5 text-sm font-medium text-gray-800 border border-r-0 rounded-l-md max-sm:rounded-l-sm border-gray-200 bg-white hover:shadow-inner dark:border-gray-850 dark:bg-gray-950 dark:text-gray-200 dark:hover:bg-gray-800" aria-live="polite"><span class="inline-flex items-center justify-center rounded-md p-0.5 max-sm:p-0 hover:text-gray-800 dark:hover:text-gray-200"><svg class="sm:size-3.5 size-3" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg></span> <span>Copy page</span></button> <button class="inline-flex items-center justify-center w-6 max-sm:w-5 h-7 max-sm:h-7 disabled:pointer-events-none text-sm text-gray-500 hover:text-gray-700 dark:hover:text-white rounded-r-md max-sm:rounded-r-sm border border-l transition border-gray-200 bg-white hover:shadow-inner dark:border-gray-850 dark:bg-gray-950 dark:text-gray-200 dark:hover:bg-gray-800" aria-haspopup="menu" aria-expanded="false" aria-label="Open copy menu"><svg class="transition-transform text-gray-400 overflow-visible sm:size-3.5 size-3 rotate-0" width="1em" height="1em" viewBox="0 0 12 7" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M1 1L6 6L11 1" stroke="currentColor"></path></svg></button></div> </div> <h1 class="relative group"><a id="архитектуры-seq2seq" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#архитектуры-seq2seq"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Архитектуры Seq2Seq</span></h1> <p data-svelte-h="svelte-77gopt">В моделях CTC, рассмотренных в предыдущем разделе, использовалась только энкодерная часть архитектуры трансформера. В случае, когда мы добавляем декодер для создания модели энкодер-декодер, это называется моделью <strong>последовательность-в-последовательность (sequence-to-sequence)</strong> или | |
| сокращенно seq2seq. Модель сопоставляет последовательность данных одного вида с последовательностью данных другого вида.</p> <p data-svelte-h="svelte-13bmu7v">В моделях трансформеров, использующих только энкодер, энкодер делал предсказание для каждого элемента входной последовательности. Поэтому и входная, и выходная последовательности всегда будут иметь одинаковую длину. В случае моделей CTC, таких как Wav2Vec2, входная форма сигнала сначала | |
| подвергалась даунсемплингу, но все равно на каждые 20 мс звука приходилось одно предсказание.</p> <p data-svelte-h="svelte-13ap5qy">В модели seq2seq такого соответствия один к одному нет, и входная и выходная последовательности могут иметь разную длину. Это делает модели seq2seq пригодными для решения задач NLP, таких как резюмирование текста или перевод с одного языка на другой, а также для решения аудио задач, таких | |
| как распознавание речи.</p> <p data-svelte-h="svelte-1dqkvdw">Архитектура декодера очень похожа на архитектуру энкодера, и в обоих случаях используются схожие слои, главной особенностью которых является самовнимание. Однако декодер выполняет иную задачу, чем энкодер. Чтобы понять, как это работает, рассмотрим, как модель seq2seq может выполнять | |
| автоматическое распознавание речи.</p> <h2 class="relative group"><a id="автоматическое-распознавание-речи" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#автоматическое-распознавание-речи"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Автоматическое распознавание речи</span></h2> <p data-svelte-h="svelte-1x2wi5x">Архитектура <strong>Whisper</strong> выглядит следующим образом (рисунок любезно предоставлен <a href="https://openai.com/blog/whisper/" rel="nofollow">блогом OpenAI Whisper</a>):</p> <div class="flex justify-center" data-svelte-h="svelte-1402zsk"><img src="https://huggingface.co/blog/assets/111_fine_tune_whisper/whisper_architecture.svg" alt="Whisper is a transformer encoder-decoder model"></div> <p data-svelte-h="svelte-9h7yrt">Все это должно выглядеть довольно знакомо. Слева находится <strong>энкодер трансформера</strong>. В качестве входного сигнала принимается лог-мел спектрограмма, которая кодируется для формирования последовательности скрытых состояний энкодера, извлекающих важные признаки из произносимой речи. | |
| Этот тензор скрытых состояний представляет входную последовательность как единое целое и эффективно кодирует “смысл” поступившей на вход речи.</p> <blockquote class="tip">💡 Обычно в таких seq2seq-моделях в качестве входных данных используются спектрограммы. Однако модель seq2seq может быть разработана и для работы непосредственно с формой волны звука.</blockquote> <p data-svelte-h="svelte-1u7v0a3">Затем выход энкодера передается в <strong>декодер трансформера</strong>, показанный справа, с помощью механизма, называемого <strong>перекрёстным вниманием (cross-attention)</strong>. Это похоже на самовнимание (self-attention), но внимание направлено на выход энкодера. С этого момента энкодер больше не нужен.</p> <p data-svelte-h="svelte-5x6ahe">Декодер предсказывает последовательность текстовых токенов <strong>авторегрессивным</strong> способом, по одному токену за раз, начиная с начальной последовательности, в которой есть только “стартовый” токен (<code>SOT</code> в случае Whisper). На каждом следующем временном интервале предыдущая выходная | |
| последовательность подается обратно в декодер в качестве новой входной последовательности. Таким образом, декодер выдает по одному новому токену за раз, неуклонно наращивая выходную последовательность, пока не спрогнозирует “конечный” токен или не будет достигнуто максимальное количество | |
| временных шагов.</p> <p data-svelte-h="svelte-1b6r346">Хотя архитектура декодера в основном идентична архитектуре кодера, есть два существенных отличия:</p> <ol data-svelte-h="svelte-15f10dx"><li>декодер имеет механизм перекрестного внимания, который позволяет ему просматривать представление энкодера о входной последовательности</li> <li>внимание декодера является каузальным - декодер не имеет права заглядывать в будущее.</li></ol> <p data-svelte-h="svelte-fcv13f">В этом случае декодер играет роль <strong>языковой модели</strong>, обрабатывая представления скрытых состояний, полученные от энкодера, и генерируя соответствующие текстовые транскрипции. Это более мощный подход, чем CTC, даже если модель CTC сочетается с внешней языковой моделью, так как система | |
| seq2seq может быть обучена от начала до конца с использованием одних и тех же обучающих данных и функции потерь, что обеспечивает большую гибкость и в целом более высокую производительность.</p> <blockquote class="tip">💡 В то время как модель CTC выводит последовательность отдельных символов, токены, предсказываемые Whisper, представляют собой полные слова или фрагменты слов. Он использует токенизатор из GPT-2 и имеет 50k+ уникальных токенов. Поэтому модель seq2seq может выдать гораздо более короткую | |
| последовательность, чем модель CTC для той же транскрипции.</blockquote> <p data-svelte-h="svelte-1tbdwnz">Типичной функцией потерь для seq2seq ASR-модели является функция кросс-энтропии, поскольку последний слой модели предсказывает распределение вероятностей по возможным токенам. Обычно это сочетается с такими методами, как <a href="https://huggingface.co/blog/how-to-generate" rel="nofollow">лучевой поиск для генерации конечной последовательности</a>. Метрикой распознавания речи является WER или word error rate, которая измеряет, сколько замен, вставок и удалений необходимо для превращения предсказанного текста в целевой - чем меньше, тем лучше результат.</p> <h2 class="relative group"><a id="преобразование-текста-в-речь-text-to-speech-tts" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#преобразование-текста-в-речь-text-to-speech-tts"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Преобразование текста в речь (Text-to-speech, TTS)</span></h2> <p data-svelte-h="svelte-14ozf6c">Возможно, это вас не удивит: Модель seq2seq для TTS работает по сути так же, как и описанная выше, но входы и выходы поменяны местами! Энкодер трансформера принимает последовательность текстовых токенов и извлекает из нее последовательность скрытых состояний, которые представляют собой | |
| входной текст. Декодер трансформера применяет перекрестное внимание к выходу энкодера и прогнозирует спектрограмму.</p> <blockquote class="tip">💡 Напомним, что спектрограмма создается путем взятия частотного спектра последовательных временных отрезков звуковой волны и их суммирования. Другими словами, спектрограмма - это последовательность, элементами которой являются (лог-мел) частотные спектры, по одному на каждый временной | |
| интервал.</blockquote> <p data-svelte-h="svelte-1jhnk8b">В ASR-модели декодер запускался с помощью последовательности, содержащей только специальный токен “start”. Для модели TTS мы можем начать декодирование со спектрограммы длиной один, состоящей из одних нулей, которая выступает в качестве “стартового токена”. Учитывая эту начальную | |
| спектрограмму и перекрестное внимание к представлениям скрытых состояний энкодера, декодер предсказывает следующий временной интервал для этой спектрограммы, постепенно увеличивая спектрограмму на один временной интервал.</p> <div class="flex justify-center" data-svelte-h="svelte-1886deo"><img src="https://huggingface.co/datasets/huggingface-course/audio-course-images/resolve/main/speecht5_decoding.png" alt="The audio waveform gets mapped to a shorter sequence of hidden-states"></div> <p data-svelte-h="svelte-1m378te">Но как декодер узнает, когда нужно остановиться? В модели <strong>SpeechT5</strong> это решается тем, что декодер предсказывает вторую последовательность. Она содержит вероятность того, что текущий временной шаг является последним. При генерации звука в момент инференса, если эта вероятность превышает | |
| определенный порог (скажем, 0,5), декодер сигнализирует о том, что спектрограмма закончена и цикл генерации должен завершиться.</p> <p data-svelte-h="svelte-1fb951v">После завершения декодирования и получения выходной последовательности, содержащей спектрограмму, SpeechT5 использует так называемую <strong>пост-сеть (post-net)</strong>, состоящую из нескольких сверточных слоев, для уточнения спектрограммы.</p> <p data-svelte-h="svelte-11gubu3">При обучении модели TTS в качестве целей также используются спектрограммы, а в качестве потерь - L1 или MSE. Во время инференса мы хотим преобразовать выходную спектрограмму в форму звукового сигнала, чтобы ее можно было прослушать. Для этого используется внешняя модель - <strong>вокодер | |
| (vocoder)</strong>. Этот вокодер не является частью архитектуры seq2seq и обучается отдельно.</p> <p data-svelte-h="svelte-pombak">Сложность TTS заключается в том, что это отображение “один-ко-многим”. При преобразовании речи в текст существует только один правильный выходной текст, соответствующий входной речи, в то время как при преобразовании текста в речь входной текст может быть сопоставлен с множеством возможных | |
| звуков речи. Например, разные дикторы могут выбирать для акцентирования внимания разные части предложения. Это затрудняет оценку моделей TTS. В связи с этим значение потерь L1 или MSE на самом деле не имеет большого смысла - существует множество способов представить один и тот же текст на | |
| спектрограмме. Именно поэтому модели TTS обычно оцениваются слушателями, используя метрику, известную как MOS (mean opinion score) или cредняя экспертная оценка.</p> <h2 class="relative group"><a id="заключение" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#заключение"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Заключение</span></h2> <p data-svelte-h="svelte-fi5f1b">Подход seq2seq является более мощным, чем модель, основанная только на энкодере. Благодаря разделению входной последовательности энкодера и выходной последовательности декодера, выравнивание звука и текста становится менее проблематичным. </p> <p data-svelte-h="svelte-seukyg">Однако модель энкодер-декодер также является более медленной, поскольку процесс декодирования происходит по одному шагу за раз, а не все сразу. Чем длиннее последовательность, тем медленнее прогнозирование. Авторегрессивные модели также могут застревать на повторах или пропускать слова. | |
| Такие методы, как лучевой поиск, позволяют улучшить качество прогнозов, но при этом еще больше замедляют декодирование.</p> <a class="!text-gray-400 !no-underline text-sm flex items-center not-prose mt-4" href="https://github.com/huggingface/audio-transformers-course/blob/main/chapters/ru/chapter3/seq2seq.mdx" target="_blank"><svg class="mr-1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M31,16l-7,7l-1.41-1.41L28.17,16l-5.58-5.59L24,9l7,7z"></path><path d="M1,16l7-7l1.41,1.41L3.83,16l5.58,5.59L8,23l-7-7z"></path><path d="M12.419,25.484L17.639,6.552l1.932,0.518L14.351,26.002z"></path></svg> <span data-svelte-h="svelte-zjs2n5"><span class="underline">Update</span> on GitHub</span></a> <p></p> | |
| <script> | |
| { | |
| __sveltekit_a3glb3 = { | |
| assets: "/docs/audio-course/pr_239/ru", | |
| base: "/docs/audio-course/pr_239/ru", | |
| env: {} | |
| }; | |
| const element = document.currentScript.parentElement; | |
| const data = [null,null]; | |
| Promise.all([ | |
| import("/docs/audio-course/pr_239/ru/_app/immutable/entry/start.13cec9b0.js"), | |
| import("/docs/audio-course/pr_239/ru/_app/immutable/entry/app.af2704da.js") | |
| ]).then(([kit, app]) => { | |
| kit.start(app, element, { | |
| node_ids: [0, 20], | |
| data, | |
| form: null, | |
| error: null | |
| }); | |
| }); | |
| } | |
| </script> | |
Xet Storage Details
- Size:
- 27.7 kB
- Xet hash:
- c90e9ce44c72534a440d0f236e6f998377024634429088435f5530f9f9fc1538
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.