import{s as se,o as ne}from"../chunks/scheduler.f7e1785c.js";import{S as ie,i as pe,g as p,s as n,r as D,A as fe,h as f,f as l,c as i,j as le,u as G,x as $,k as Pt,y as ae,a as s,v as N,d as U,t as B,w as F,m as dt,n as bt}from"../chunks/index.9f8f0838.js";import{T as St}from"../chunks/Tip.4575d9cf.js";import{H as wt}from"../chunks/Heading.6643a2f7.js";function me(r){let a;return{c(){a=dt("💡 Обычно в таких seq2seq-моделях в качестве входных данных используются спектрограммы. Однако модель seq2seq может быть разработана и для работы непосредственно с формой волны звука.")},l(m){a=bt(m,"💡 Обычно в таких seq2seq-моделях в качестве входных данных используются спектрограммы. Однако модель seq2seq может быть разработана и для работы непосредственно с формой волны звука.")},m(m,u){s(m,a,u)},d(m){m&&l(a)}}}function $e(r){let a;return{c(){a=dt(`💡 В то время как модель CTC выводит последовательность отдельных символов, токены, предсказываемые Whisper, представляют собой полные слова или фрагменты слов. Он использует токенизатор из GPT-2 и имеет 50k+ уникальных токенов. Поэтому модель seq2seq может выдать гораздо более короткую
последовательность, чем модель CTC для той же транскрипции.`)},l(m){a=bt(m,`💡 В то время как модель CTC выводит последовательность отдельных символов, токены, предсказываемые Whisper, представляют собой полные слова или фрагменты слов. Он использует токенизатор из GPT-2 и имеет 50k+ уникальных токенов. Поэтому модель seq2seq может выдать гораздо более короткую
последовательность, чем модель CTC для той же транскрипции.`)},m(m,u){s(m,a,u)},d(m){m&&l(a)}}}function ue(r){let a;return{c(){a=dt(`💡 Напомним, что спектрограмма создается путем взятия частотного спектра последовательных временных отрезков звуковой волны и их суммирования. Другими словами, спектрограмма - это последовательность, элементами которой являются (лог-мел) частотные спектры, по одному на каждый временной
интервал.`)},l(m){a=bt(m,`💡 Напомним, что спектрограмма создается путем взятия частотного спектра последовательных временных отрезков звуковой волны и их суммирования. Другими словами, спектрограмма - это последовательность, элементами которой являются (лог-мел) частотные спектры, по одному на каждый временной
интервал.`)},m(m,u){s(m,a,u)},d(m){m&&l(a)}}}function re(r){let a,m,u,K,x,Q,q,kt=`В моделях CTC, рассмотренных в предыдущем разделе, использовалась только энкодерная часть архитектуры трансформера. В случае, когда мы добавляем декодер для создания модели энкодер-декодер, это называется моделью <strong>последовательность-в-последовательность (sequence-to-sequence)</strong> или
сокращенно seq2seq. Модель сопоставляет последовательность данных одного вида с последовательностью данных другого вида.`,X,c,Wt=`В моделях трансформеров, использующих только энкодер, энкодер делал предсказание для каждого элемента входной последовательности. Поэтому и входная, и выходная последовательности всегда будут иметь одинаковую длину. В случае моделей CTC, таких как Wav2Vec2, входная форма сигнала сначала
подвергалась даунсемплингу, но все равно на каждые 20 мс звука приходилось одно предсказание.`,Y,L,Et=`В модели seq2seq такого соответствия один к одному нет, и входная и выходная последовательности могут иметь разную длину. Это делает модели seq2seq пригодными для решения задач NLP, таких как резюмирование текста или перевод с одного языка на другой, а также для решения аудио задач, таких
как распознавание речи.`,Z,M,At=`Архитектура декодера очень похожа на архитектуру энкодера, и в обоих случаях используются схожие слои, главной особенностью которых является самовнимание. Однако декодер выполняет иную задачу, чем энкодер. Чтобы понять, как это работает, рассмотрим, как модель seq2seq может выполнять
автоматическое распознавание речи.`,tt,g,et,h,jt='Архитектура <strong>Whisper</strong> выглядит следующим образом (рисунок любезно предоставлен <a href="https://openai.com/blog/whisper/" rel="nofollow">блогом OpenAI Whisper</a>):',lt,o,yt='<img src="https://huggingface.co/blog/assets/111_fine_tune_whisper/whisper_architecture.svg" alt="Whisper is a transformer encoder-decoder model"/>',st,H,zt=`Все это должно выглядеть довольно знакомо. Слева находится <strong>энкодер трансформера</strong>. В качестве входного сигнала принимается лог-мел спектрограмма, которая кодируется для формирования последовательности скрытых состояний энкодера, извлекающих важные признаки из произносимой речи.
Этот тензор скрытых состояний представляет входную последовательность как единое целое и эффективно кодирует “смысл” поступившей на вход речи.`,nt,T,it,P,Ot="Затем выход энкодера передается в <strong>декодер трансформера</strong>, показанный справа, с помощью механизма, называемого <strong>перекрёстным вниманием (cross-attention)</strong>. Это похоже на самовнимание (self-attention), но внимание направлено на выход энкодера. С этого момента энкодер больше не нужен.",pt,w,Rt=`Декодер предсказывает последовательность текстовых токенов <strong>авторегрессивным</strong> способом, по одному токену за раз, начиная с начальной последовательности, в которой есть только “стартовый” токен (<code>SOT</code> в случае Whisper). На каждом следующем временном интервале предыдущая выходная
последовательность подается обратно в декодер в качестве новой входной последовательности. Таким образом, декодер выдает по одному новому токену за раз, неуклонно наращивая выходную последовательность, пока не спрогнозирует “конечный” токен или не будет достигнуто максимальное количество
временных шагов.`,ft,S,It="Хотя архитектура декодера в основном идентична архитектуре кодера, есть два существенных отличия:",at,d,Vt="<li>декодер имеет механизм перекрестного внимания, который позволяет ему просматривать представление энкодера о входной последовательности</li> <li>внимание декодера является каузальным - декодер не имеет права заглядывать в будущее.</li>",mt,b,Dt=`В этом случае декодер играет роль <strong>языковой модели</strong>, обрабатывая представления скрытых состояний, полученные от энкодера, и генерируя соответствующие текстовые транскрипции. Это более мощный подход, чем CTC, даже если модель CTC сочетается с внешней языковой моделью, так как система
seq2seq может быть обучена от начала до конца с использованием одних и тех же обучающих данных и функции потерь, что обеспечивает большую гибкость и в целом более высокую производительность.`,$t,v,ut,k,Gt='Типичной функцией потерь для seq2seq ASR-модели является функция кросс-энтропии, поскольку последний слой модели предсказывает распределение вероятностей по возможным токенам. Обычно это сочетается с такими методами, как <a href="https://huggingface.co/blog/how-to-generate" rel="nofollow">лучевой поиск для генерации конечной последовательности</a>. Метрикой распознавания речи является WER или word error rate, которая измеряет, сколько замен, вставок и удалений необходимо для превращения предсказанного текста в целевой - чем меньше, тем лучше результат.',rt,W,ot,E,Nt=`Возможно, это вас не удивит: Модель seq2seq для TTS работает по сути так же, как и описанная выше, но входы и выходы поменяны местами! Энкодер трансформера принимает последовательность текстовых токенов и извлекает из нее последовательность скрытых состояний, которые представляют собой
входной текст. Декодер трансформера применяет перекрестное внимание к выходу энкодера и прогнозирует спектрограмму.`,Tt,C,vt,A,Ut=`В ASR-модели декодер запускался с помощью последовательности, содержащей только специальный токен “start”. Для модели TTS мы можем начать декодирование со спектрограммы длиной один, состоящей из одних нулей, которая выступает в качестве “стартового токена”. Учитывая эту начальную
спектрограмму и перекрестное внимание к представлениям скрытых состояний энкодера, декодер предсказывает следующий временной интервал для этой спектрограммы, постепенно увеличивая спектрограмму на один временной интервал.`,Ct,_,Bt='<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"/>',_t,j,Ft=`Но как декодер узнает, когда нужно остановиться? В модели <strong>SpeechT5</strong> это решается тем, что декодер предсказывает вторую последовательность. Она содержит вероятность того, что текущий временной шаг является последним. При генерации звука в момент инференса, если эта вероятность превышает
определенный порог (скажем, 0,5), декодер сигнализирует о том, что спектрограмма закончена и цикл генерации должен завершиться.`,xt,y,Jt="После завершения декодирования и получения выходной последовательности, содержащей спектрограмму, SpeechT5 использует так называемую <strong>пост-сеть (post-net)</strong>, состоящую из нескольких сверточных слоев, для уточнения спектрограммы.",qt,z,Kt=`При обучении модели TTS в качестве целей также используются спектрограммы, а в качестве потерь - L1 или MSE. Во время инференса мы хотим преобразовать выходную спектрограмму в форму звукового сигнала, чтобы ее можно было прослушать. Для этого используется внешняя модель - <strong>вокодер
(vocoder)</strong>. Этот вокодер не является частью архитектуры seq2seq и обучается отдельно.`,ct,O,Qt=`Сложность TTS заключается в том, что это отображение “один-ко-многим”. При преобразовании речи в текст существует только один правильный выходной текст, соответствующий входной речи, в то время как при преобразовании текста в речь входной текст может быть сопоставлен с множеством возможных
звуков речи. Например, разные дикторы могут выбирать для акцентирования внимания разные части предложения. Это затрудняет оценку моделей TTS. В связи с этим значение потерь L1 или MSE на самом деле не имеет большого смысла - существует множество способов представить один и тот же текст на
спектрограмме. Именно поэтому модели TTS обычно оцениваются слушателями, используя метрику, известную как MOS (mean opinion score) или cредняя экспертная оценка.`,Lt,R,Mt,I,Xt="Подход seq2seq является более мощным, чем модель, основанная только на энкодере. Благодаря разделению входной последовательности энкодера и выходной последовательности декодера, выравнивание звука и текста становится менее проблематичным.",gt,V,Yt=`Однако модель энкодер-декодер также является более медленной, поскольку процесс декодирования происходит по одному шагу за раз, а не все сразу. Чем длиннее последовательность, тем медленнее прогнозирование. Авторегрессивные модели также могут застревать на повторах или пропускать слова.
Такие методы, как лучевой поиск, позволяют улучшить качество прогнозов, но при этом еще больше замедляют декодирование.`,ht,J,Ht;return x=new wt({props:{title:"Архитектуры Seq2Seq",local:"архитектуры-seq2seq",headingTag:"h1"}}),g=new wt({props:{title:"Автоматическое распознавание речи",local:"автоматическое-распознавание-речи",headingTag:"h2"}}),T=new St({props:{$$slots:{default:[me]},$$scope:{ctx:r}}}),v=new St({props:{$$slots:{default:[$e]},$$scope:{ctx:r}}}),W=new wt({props:{title:"Преобразование текста в речь (Text-to-speech, TTS)",local:"преобразование-текста-в-речь-text-to-speech-tts",headingTag:"h2"}}),C=new St({props:{$$slots:{default:[ue]},$$scope:{ctx:r}}}),R=new wt({props:{title:"Заключение",local:"заключение",headingTag:"h2"}}),{c(){a=p("meta"),m=n(),u=p("p"),K=n(),D(x.$$.fragment),Q=n(),q=p("p"),q.innerHTML=kt,X=n(),c=p("p"),c.textContent=Wt,Y=n(),L=p("p"),L.textContent=Et,Z=n(),M=p("p"),M.textContent=At,tt=n(),D(g.$$.fragment),et=n(),h=p("p"),h.innerHTML=jt,lt=n(),o=p("div"),o.innerHTML=yt,st=n(),H=p("p"),H.innerHTML=zt,nt=n(),D(T.$$.fragment),it=n(),P=p("p"),P.innerHTML=Ot,pt=n(),w=p("p"),w.innerHTML=Rt,ft=n(),S=p("p"),S.textContent=It,at=n(),d=p("ol"),d.innerHTML=Vt,mt=n(),b=p("p"),b.innerHTML=Dt,$t=n(),D(v.$$.fragment),ut=n(),k=p("p"),k.innerHTML=Gt,rt=n(),D(W.$$.fragment),ot=n(),E=p("p"),E.textContent=Nt,Tt=n(),D(C.$$.fragment),vt=n(),A=p("p"),A.textContent=Ut,Ct=n(),_=p("div"),_.innerHTML=Bt,_t=n(),j=p("p"),j.innerHTML=Ft,xt=n(),y=p("p"),y.innerHTML=Jt,qt=n(),z=p("p"),z.innerHTML=Kt,ct=n(),O=p("p"),O.textContent=Qt,Lt=n(),D(R.$$.fragment),Mt=n(),I=p("p"),I.textContent=Xt,gt=n(),V=p("p"),V.textContent=Yt,ht=n(),J=p("p"),this.h()},l(t){const e=fe("svelte-u9bgzb",document.head);a=f(e,"META",{name:!0,content:!0}),e.forEach(l),m=i(t),u=f(t,"P",{}),le(u).forEach(l),K=i(t),G(x.$$.fragment,t),Q=i(t),q=f(t,"P",{"data-svelte-h":!0}),$(q)!=="svelte-77gopt"&&(q.innerHTML=kt),X=i(t),c=f(t,"P",{"data-svelte-h":!0}),$(c)!=="svelte-13bmu7v"&&(c.textContent=Wt),Y=i(t),L=f(t,"P",{"data-svelte-h":!0}),$(L)!=="svelte-13ap5qy"&&(L.textContent=Et),Z=i(t),M=f(t,"P",{"data-svelte-h":!0}),$(M)!=="svelte-1dqkvdw"&&(M.textContent=At),tt=i(t),G(g.$$.fragment,t),et=i(t),h=f(t,"P",{"data-svelte-h":!0}),$(h)!=="svelte-1x2wi5x"&&(h.innerHTML=jt),lt=i(t),o=f(t,"DIV",{class:!0,"data-svelte-h":!0}),$(o)!=="svelte-1402zsk"&&(o.innerHTML=yt),st=i(t),H=f(t,"P",{"data-svelte-h":!0}),$(H)!=="svelte-9h7yrt"&&(H.innerHTML=zt),nt=i(t),G(T.$$.fragment,t),it=i(t),P=f(t,"P",{"data-svelte-h":!0}),$(P)!=="svelte-1u7v0a3"&&(P.innerHTML=Ot),pt=i(t),w=f(t,"P",{"data-svelte-h":!0}),$(w)!=="svelte-5x6ahe"&&(w.innerHTML=Rt),ft=i(t),S=f(t,"P",{"data-svelte-h":!0}),$(S)!=="svelte-1b6r346"&&(S.textContent=It),at=i(t),d=f(t,"OL",{"data-svelte-h":!0}),$(d)!=="svelte-15f10dx"&&(d.innerHTML=Vt),mt=i(t),b=f(t,"P",{"data-svelte-h":!0}),$(b)!=="svelte-fcv13f"&&(b.innerHTML=Dt),$t=i(t),G(v.$$.fragment,t),ut=i(t),k=f(t,"P",{"data-svelte-h":!0}),$(k)!=="svelte-1tbdwnz"&&(k.innerHTML=Gt),rt=i(t),G(W.$$.fragment,t),ot=i(t),E=f(t,"P",{"data-svelte-h":!0}),$(E)!=="svelte-14ozf6c"&&(E.textContent=Nt),Tt=i(t),G(C.$$.fragment,t),vt=i(t),A=f(t,"P",{"data-svelte-h":!0}),$(A)!=="svelte-1jhnk8b"&&(A.textContent=Ut),Ct=i(t),_=f(t,"DIV",{class:!0,"data-svelte-h":!0}),$(_)!=="svelte-1886deo"&&(_.innerHTML=Bt),_t=i(t),j=f(t,"P",{"data-svelte-h":!0}),$(j)!=="svelte-1m378te"&&(j.innerHTML=Ft),xt=i(t),y=f(t,"P",{"data-svelte-h":!0}),$(y)!=="svelte-1fb951v"&&(y.innerHTML=Jt),qt=i(t),z=f(t,"P",{"data-svelte-h":!0}),$(z)!=="svelte-11gubu3"&&(z.innerHTML=Kt),ct=i(t),O=f(t,"P",{"data-svelte-h":!0}),$(O)!=="svelte-pombak"&&(O.textContent=Qt),Lt=i(t),G(R.$$.fragment,t),Mt=i(t),I=f(t,"P",{"data-svelte-h":!0}),$(I)!=="svelte-fi5f1b"&&(I.textContent=Xt),gt=i(t),V=f(t,"P",{"data-svelte-h":!0}),$(V)!=="svelte-seukyg"&&(V.textContent=Yt),ht=i(t),J=f(t,"P",{}),le(J).forEach(l),this.h()},h(){Pt(a,"name","hf:doc:metadata"),Pt(a,"content",oe),Pt(o,"class","flex justify-center"),Pt(_,"class","flex justify-center")},m(t,e){ae(document.head,a),s(t,m,e),s(t,u,e),s(t,K,e),N(x,t,e),s(t,Q,e),s(t,q,e),s(t,X,e),s(t,c,e),s(t,Y,e),s(t,L,e),s(t,Z,e),s(t,M,e),s(t,tt,e),N(g,t,e),s(t,et,e),s(t,h,e),s(t,lt,e),s(t,o,e),s(t,st,e),s(t,H,e),s(t,nt,e),N(T,t,e),s(t,it,e),s(t,P,e),s(t,pt,e),s(t,w,e),s(t,ft,e),s(t,S,e),s(t,at,e),s(t,d,e),s(t,mt,e),s(t,b,e),s(t,$t,e),N(v,t,e),s(t,ut,e),s(t,k,e),s(t,rt,e),N(W,t,e),s(t,ot,e),s(t,E,e),s(t,Tt,e),N(C,t,e),s(t,vt,e),s(t,A,e),s(t,Ct,e),s(t,_,e),s(t,_t,e),s(t,j,e),s(t,xt,e),s(t,y,e),s(t,qt,e),s(t,z,e),s(t,ct,e),s(t,O,e),s(t,Lt,e),N(R,t,e),s(t,Mt,e),s(t,I,e),s(t,gt,e),s(t,V,e),s(t,ht,e),s(t,J,e),Ht=!0},p(t,[e]){const Zt={};e&2&&(Zt.$$scope={dirty:e,ctx:t}),T.$set(Zt);const te={};e&2&&(te.$$scope={dirty:e,ctx:t}),v.$set(te);const ee={};e&2&&(ee.$$scope={dirty:e,ctx:t}),C.$set(ee)},i(t){Ht||(U(x.$$.fragment,t),U(g.$$.fragment,t),U(T.$$.fragment,t),U(v.$$.fragment,t),U(W.$$.fragment,t),U(C.$$.fragment,t),U(R.$$.fragment,t),Ht=!0)},o(t){B(x.$$.fragment,t),B(g.$$.fragment,t),B(T.$$.fragment,t),B(v.$$.fragment,t),B(W.$$.fragment,t),B(C.$$.fragment,t),B(R.$$.fragment,t),Ht=!1},d(t){t&&(l(m),l(u),l(K),l(Q),l(q),l(X),l(c),l(Y),l(L),l(Z),l(M),l(tt),l(et),l(h),l(lt),l(o),l(st),l(H),l(nt),l(it),l(P),l(pt),l(w),l(ft),l(S),l(at),l(d),l(mt),l(b),l($t),l(ut),l(k),l(rt),l(ot),l(E),l(Tt),l(vt),l(A),l(Ct),l(_),l(_t),l(j),l(xt),l(y),l(qt),l(z),l(ct),l(O),l(Lt),l(Mt),l(I),l(gt),l(V),l(ht),l(J)),l(a),F(x,t),F(g,t),F(T,t),F(v,t),F(W,t),F(C,t),F(R,t)}}}const oe='{"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}';function Te(r){return ne(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class qe extends ie{constructor(a){super(),pe(this,a,Te,re,se,{})}}export{qe as component};
