import{S as Dn,i as Gn,s as jn,e as o,k as p,w as X,t as n,M as Wn,c as a,d as s,m as f,a as l,x as Y,h as r,b as d,N as On,G as t,g as i,y as Z,q as ee,o as te,B as se,v as Un}from"../../chunks/vendor-hf-doc-builder.js";import{T as Vs}from"../../chunks/Tip-hf-doc-builder.js";import{I as gt}from"../../chunks/IconCopyLink-hf-doc-builder.js";function zn(w){let c;return{c(){c=n("\u{1F4A1} Il est courant que ces mod\xE8les seq2seq utilisent des spectrogrammes comme entr\xE9e. Cependant, un mod\xE8le seq2seq peut \xE9galement \xEAtre con\xE7u pour fonctionner directement sur les formes d'onde audio.")},l(q){c=r(q,"\u{1F4A1} Il est courant que ces mod\xE8les seq2seq utilisent des spectrogrammes comme entr\xE9e. Cependant, un mod\xE8le seq2seq peut \xE9galement \xEAtre con\xE7u pour fonctionner directement sur les formes d'onde audio.")},m(q,h){i(q,c,h)},d(q){q&&s(c)}}}function Hn(w){let c;return{c(){c=n("\u{1F4A1} Alors qu'un mod\xE8le avec CTC produit une s\xE9quence de caract\xE8res individuels, les *tokens* pr\xE9dits par Whisper sont des mots complets ou des portions de mots. Il utilise le tokenizer de GPT-2 et dispose d\u2019environ 50 000 *tokens* uniques. Un mod\xE8le seq2seq peut donc produire une s\xE9quence beaucoup plus courte qu'un mod\xE8le CTC pour la m\xEAme transcription.")},l(q){c=r(q,"\u{1F4A1} Alors qu'un mod\xE8le avec CTC produit une s\xE9quence de caract\xE8res individuels, les *tokens* pr\xE9dits par Whisper sont des mots complets ou des portions de mots. Il utilise le tokenizer de GPT-2 et dispose d\u2019environ 50 000 *tokens* uniques. Un mod\xE8le seq2seq peut donc produire une s\xE9quence beaucoup plus courte qu'un mod\xE8le CTC pour la m\xEAme transcription.")},m(q,h){i(q,c,h)},d(q){q&&s(c)}}}function Vn(w){let c;return{c(){c=n("\u{1F4A1} Rappelons qu'un spectrogramme est fabriqu\xE9 en prenant le spectre de fr\xE9quences de tranches de temps successives d'une forme d'onde audio et en les empilant ensemble. En d'autres termes, un spectrogramme est une s\xE9quence o\xF9 les \xE9l\xE9ments sont des spectres de fr\xE9quence (log-mel), un pour chaque pas de temps.")},l(q){c=r(q,"\u{1F4A1} Rappelons qu'un spectrogramme est fabriqu\xE9 en prenant le spectre de fr\xE9quences de tranches de temps successives d'une forme d'onde audio et en les empilant ensemble. En d'autres termes, un spectrogramme est une s\xE9quence o\xF9 les \xE9l\xE9ments sont des spectres de fr\xE9quence (log-mel), un pour chaque pas de temps.")},m(q,h){i(q,c,h)},d(q){q&&s(c)}}}function Bn(w){let c,q,h,T,de,W,_t,ce,Et,Je,_,$t,me,bt,xt,pe,Ct,yt,fe,St,Lt,Fe,y,k,qe,U,wt,ve,Tt,Ke,b,kt,he,At,Pt,z,Mt,Nt,Qe,H,ne,Bs,Xe,A,Rt,re,It,ge,Ot,Dt,Ye,P,Ze,m,Gt,oe,jt,_e,Wt,Ut,Ee,zt,Ht,$e,Vt,Bt,be,Jt,Ft,xe,Kt,Qt,Ce,Xt,Yt,ye,Zt,es,Se,ts,ss,Le,ns,rs,et,M,we,os,as,V,ls,Te,us,is,tt,N,st,E,ds,ke,cs,ms,B,ps,fs,Ae,qs,vs,nt,S,R,Pe,J,hs,Me,gs,rt,$,_s,Ne,Es,$s,Re,bs,xs,Ie,Cs,ys,ot,I,at,x,Ss,Oe,Ls,ws,De,Ts,ks,lt,F,ae,Js,ut,g,As,Ge,Ps,Ms,je,Ns,Rs,We,Is,Os,Ue,Ds,Gs,it,L,O,ze,K,js,He,Ws,dt,le,Us,ct;return W=new gt({}),U=new gt({}),P=new Vs({props:{$$slots:{default:[zn]},$$scope:{ctx:w}}}),N=new Vs({props:{$$slots:{default:[Hn]},$$scope:{ctx:w}}}),J=new gt({}),I=new Vs({props:{$$slots:{default:[Vn]},$$scope:{ctx:w}}}),K=new gt({}),{c(){c=o("meta"),q=p(),h=o("h1"),T=o("a"),de=o("span"),X(W.$$.fragment),_t=p(),ce=o("span"),Et=n("Architectures Seq2Seq"),Je=p(),_=o("p"),$t=n("Les mod\xE8les avec CTC abord\xE9s dans la section pr\xE9c\xE9dente utilisent uniquement la partie encodeur du "),me=o("em"),bt=n("transformer"),xt=n(". Lorsque nous ajoutons \xE9galement le d\xE9codeur pour cr\xE9er un mod\xE8le encodeur-d\xE9codeur, on parle alors de mod\xE8le "),pe=o("strong"),Ct=n("s\xE9quence \xE0 s\xE9quence"),yt=n(` ou seq2seq en abr\xE9g\xE9. Le mod\xE8le essocie une s\xE9quence d\u2019un type de donn\xE9es \xE0 une s\xE9quence d\u2019un autre type de donn\xE9es.
Avec les `),fe=o("em"),St=n("transformers"),Lt=n(` encodeur, l\u2019encodeur fait une pr\xE9diction pour chaque \xE9l\xE9ment de la s\xE9quence d\u2019entr\xE9e. Par cons\xE9quent, les s\xE9quences d\u2019entr\xE9e et de sortie auront toujours la m\xEAme longueur. Dans le cas de mod\xE8les avec CTC tels que Wav2Vec2, la forme d\u2019onde d\u2019entr\xE9e est d\u2019abord sous-\xE9chantillonn\xE9e, mais il y a toujours une pr\xE9diction pour chaque 20 ms d\u2019audio.
Avec un mod\xE8le seq2seq, il n\u2019y a pas une telle correspondance un-\xE0-un et les s\xE9quences d\u2019entr\xE9e et de sortie peuvent avoir des longueurs diff\xE9rentes. Cela rend les mod\xE8les seq2seq adapt\xE9s aux t\xE2ches de NLP telles que le r\xE9sum\xE9 de texte ou la traduction entre diff\xE9rentes langues, mais aussi aux t\xE2ches audio telles que la reconnaissance vocale.
L\u2019architecture d\u2019un d\xE9codeur est tr\xE8s similaire \xE0 celle d\u2019un encodeur, et les deux utilisent des couches similaires avec l\u2019auto-attention comme caract\xE9ristique principale. Toutefois, le d\xE9codeur effectue une t\xE2che diff\xE9rente de celle de l\u2019encodeur. Pour voir comment cela fonctionne, examinons comment un mod\xE8le seq2seq peut effectuer une reconnaissance automatique de la parole.`),Fe=p(),y=o("h2"),k=o("a"),qe=o("span"),X(U.$$.fragment),wt=p(),ve=o("span"),Tt=n("Reconnaissance automatique de la parole"),Ke=p(),b=o("p"),kt=n("L\u2019architecture de "),he=o("strong"),At=n("Whisper"),Pt=n(" est la suivante (figure provenant du blog d\u2019"),z=o("a"),Mt=n("OpenAI"),Nt=n(") :"),Qe=p(),H=o("div"),ne=o("img"),Xe=p(),A=o("p"),Rt=n("Cela devrait vous sembler assez familier. Sur la gauche se trouve l\u2019"),re=o("strong"),It=n("encodeur du "),ge=o("em"),Ot=n("transformer"),Dt=n(". Il prend comme entr\xE9e un spectrogramme log-mel et encode ce spectrogramme pour former une s\xE9quence d\u2019\xE9tats cach\xE9s de l\u2019encodeur qui extraient des caract\xE9ristiques importantes de la parole. Ce tenseur \xE0 \xE9tats cach\xE9s repr\xE9sente la s\xE9quence d\u2019entr\xE9e dans son ensemble et code efficacement le \xAB sens \xBB du discours d\u2019entr\xE9e."),Ye=p(),X(P.$$.fragment),Ze=p(),m=o("p"),Gt=n("La sortie de l\u2019encodeur est ensuite pass\xE9e dans le "),oe=o("strong"),jt=n("d\xE9codeur du "),_e=o("em"),Wt=n("transformer"),Ut=n(", illustr\xE9 \xE0 droite, \xE0 l\u2019aide d\u2019un m\xE9canisme d\u2019"),Ee=o("strong"),zt=n("attention crois\xE9e"),Ht=n(`. C\u2019est comme l\u2019auto-attention, mais assiste la sortie de l\u2019encodeur. \xC0 partir de ce moment, l\u2019encodeur n\u2019est plus n\xE9cessaire.
Le d\xE9codeur pr\xE9dit une s\xE9quence de `),$e=o("em"),Vt=n("tokens"),Bt=n(" de texte de mani\xE8re "),be=o("strong"),Jt=n("autor\xE9gressive"),Ft=n(", un seul "),xe=o("em"),Kt=n("token"),Qt=n(" \xE0 la fois, \xE0 partir d\u2019une s\xE9quence initiale qui contient juste un "),Ce=o("em"),Xt=n("token"),Yt=n(" \xAB start \xBB ("),ye=o("code"),Zt=n("SOT"),es=n(" dans le cas de Whisper). \xC0 chaque pas de temps suivant, la s\xE9quence de sortie pr\xE9c\xE9dente est r\xE9introduite dans le d\xE9codeur en tant que nouvelle s\xE9quence d\u2019entr\xE9e. De cette mani\xE8re, le d\xE9codeur \xE9met un nouveau "),Se=o("em"),ts=n("token"),ss=n(" \xE0 la fois, augmentant r\xE9guli\xE8rement la s\xE9quence de sortie, jusqu\u2019\xE0 ce qu\u2019il pr\xE9dise qu\u2019un "),Le=o("em"),ns=n("token"),rs=n(` de fin ou un nombre maximum de pas de temps est atteint.
Alors que l\u2019architecture du d\xE9codeur est en grande partie identique \xE0 celle de l\u2019encodeur, il existe deux grandes diff\xE9rences:`),et=p(),M=o("ol"),we=o("li"),os=n("Le d\xE9codeur a un m\xE9canisme d\u2019attention crois\xE9e qui lui permet de regarder la repr\xE9sentation de l\u2019encodeur de la s\xE9quence d\u2019entr\xE9e"),as=p(),V=o("li"),ls=n(`L\u2019attention du d\xE9codeur est causale : le d\xE9codeur n\u2019est pas autoris\xE9 \xE0 regarder vers l\u2019avenir.
Dans cette conception, le d\xE9codeur joue le r\xF4le d\u2019un `),Te=o("strong"),us=n("mod\xE8le de langage"),is=n(", traitant les repr\xE9sentations \xE0 l\u2019\xE9tat cach\xE9 de l\u2019encodeur et g\xE9n\xE9rant les transcriptions de texte correspondantes. Il s\u2019agit d\u2019une approche plus puissante que la CTC (m\xEAme si la CTC est combin\xE9e avec un mod\xE8le de langage externe), car le syst\xE8me seq2seq peut \xEAtre entra\xEEn\xE9 de bout en bout avec les m\xEAmes donn\xE9es d\u2019apprentissage et la m\xEAme fonction de perte, offrant une plus grande flexibilit\xE9 et des performances g\xE9n\xE9ralement sup\xE9rieures."),tt=p(),X(N.$$.fragment),st=p(),E=o("p"),ds=n("Une fonction de perte typique pour un mod\xE8le d\u2019ASR seq2seq est la perte d\u2019entropie crois\xE9e car la derni\xE8re couche du mod\xE8le pr\xE9dit une distribution de probabilit\xE9 sur les "),ke=o("em"),cs=n("tokens"),ms=n(" possibles. Ceci est g\xE9n\xE9ralement combin\xE9 avec des techniques telles que "),B=o("a"),ps=n("recherche en faisceau pour g\xE9n\xE9rer la s\xE9quence finale"),fs=n(". La m\xE9trique de la reconnaissance vocale est le WER ("),Ae=o("em"),qs=n("word error rate"),vs=n(") ou taux d\u2019erreur de mots, qui mesure le nombre de substitutions, d\u2019insertions et de suppressions n\xE9cessaires pour transformer le texte pr\xE9dit en texte cible. Moins il y en a, meilleur est le score."),nt=p(),S=o("h2"),R=o("a"),Pe=o("span"),X(J.$$.fragment),hs=p(),Me=o("span"),gs=n("Synth\xE8se vocale"),rt=p(),$=o("p"),_s=n("Cela ne vous surprendra peut-\xEAtre pas : un mod\xE8le seq2seq pour la synth\xE8se vocale fonctionne essentiellement de la m\xEAme mani\xE8re que d\xE9crit ci-dessus, mais avec les entr\xE9es et les sorties invers\xE9es ! L\u2019encodeur du "),Ne=o("em"),Es=n("transformer"),$s=n(" prend une s\xE9quence de "),Re=o("em"),bs=n("tokens"),xs=n(" de texte et extrait une s\xE9quence d\u2019\xE9tats masqu\xE9s qui repr\xE9sentent le texte d\u2019entr\xE9e. Le d\xE9codeur du "),Ie=o("em"),Cs=n("transformer"),ys=n(" applique une attention crois\xE9e \xE0 la sortie de l\u2019encodeur et pr\xE9dit un spectrogramme."),ot=p(),X(I.$$.fragment),at=p(),x=o("p"),Ss=n("Avec le mod\xE8le d\u2019ASR, le d\xE9codeur a \xE9t\xE9 d\xE9marr\xE9 \xE0 l\u2019aide d\u2019une s\xE9quence qui contient simplement le "),Oe=o("em"),Ls=n("token"),ws=n(" sp\xE9cial \xAB start \xBB. Pour le mod\xE8le de synth\xE8se vocale, on peut commencer le d\xE9codage avec un spectrogramme de longueur 1 et rempli de 0 qui agit comme le \xAB "),De=o("em"),Ts=n("token"),ks=n(" de d\xE9part \xBB. Compte tenu de ce spectrogramme initial et des attentions crois\xE9es sur les repr\xE9sentations \xE0 l\u2019\xE9tat cach\xE9 de l\u2019encodeur, le d\xE9codeur pr\xE9dit ensuite la prochaine tranche de temps pour ce spectrogramme, augmentant r\xE9guli\xE8rement le spectrogramme un pas de temps \xE0 la fois."),lt=p(),F=o("div"),ae=o("img"),ut=p(),g=o("p"),As=n("Mais comment le d\xE9codeur sait-il quand s\u2019arr\xEAter ? Dans le mod\xE8le "),Ge=o("strong"),Ps=n("SpeechT5"),Ms=n(`, cela est g\xE9r\xE9 en faisant pr\xE9dire au d\xE9codeur une deuxi\xE8me s\xE9quence. Il contient la probabilit\xE9 que le pas de temps actuel soit le dernier. Lors de la g\xE9n\xE9ration audio au moment de l\u2019inf\xE9rence, si cette probabilit\xE9 d\xE9passe un certain seuil (disons 0,5), le d\xE9codeur indique que le spectrogramme est termin\xE9 et que la boucle de g\xE9n\xE9ration doit se terminer.
Une fois le d\xE9codage termin\xE9 et que nous avons une s\xE9quence de sortie contenant le spectrogramme, SpeechT5 utilise un `),je=o("strong"),Ns=n("post-net"),Rs=n(` qui est compos\xE9 de plusieurs couches de convolution pour affiner le spectrogramme.
Lors de l\u2019entra\xEEnement du mod\xE8le de synth\xE8se vocale, les cibles sont aussi des spectrogrammes et la perte est la L1 ou la MSE. Au moment de l\u2019inf\xE9rence, nous voulons convertir le spectrogramme de sortie en une forme d\u2019onde audio afin que nous puissions r\xE9ellement l\u2019\xE9couter. Pour cela, un mod\xE8le externe est utilis\xE9, le `),We=o("strong"),Is=n("vocodeur"),Os=n(`. Ce vocodeur ne fait pas partie de l\u2019architecture seq2seq et est entra\xEEn\xE9 s\xE9par\xE9ment.
Ce qui rend la synth\xE8se vocale difficile, est qu\u2019il s\u2019agit d\u2019une association un-\xE0-plusieurs. Avec la reconnaissance de la parole, il n\u2019y a qu\u2019un seul texte de sortie correct correspondant au discours d\u2019entr\xE9e, mais avec la synth\xE8se vocale, le texte d\u2019entr\xE9e peut \xEAtre associ\xE9 \xE0 de nombreux sons possibles. Diff\xE9rents orateurs peuvent choisir de mettre l\u2019accent sur diff\xE9rentes parties de la phrase, par exemple. Cela rend les mod\xE8les de synth\xE8se vocale difficiles \xE0 \xE9valuer. Pour cette raison, la valeur de perte L1 ou MSE n\u2019est pas vraiment significative : il existe plusieurs fa\xE7ons de repr\xE9senter le m\xEAme texte dans un spectrogramme. C\u2019est pourquoi les mod\xE8les TTS sont g\xE9n\xE9ralement \xE9valu\xE9s par des auditeurs humains, en utilisant une m\xE9trique connue sous le nom de MOS (`),Ue=o("em"),Ds=n("mean opinion score"),Gs=n(") ou score d\u2019opinion moyen."),it=p(),L=o("h2"),O=o("a"),ze=o("span"),X(K.$$.fragment),js=p(),He=o("span"),Ws=n("Conclusion"),dt=p(),le=o("p"),Us=n(`L\u2019approche seq2seq est plus puissante qu\u2019un mod\xE8le d\u2019encodeur. En s\xE9parant l\u2019encodage de la s\xE9quence d\u2019entr\xE9e du d\xE9codage de la s\xE9quence de sortie, l\u2019alignement de l\u2019audio et du texte est moins probl\xE9matique.  Le mod\xE8le apprend \xE0 effectuer cet alignement gr\xE2ce au m\xE9canisme d\u2019attention.
Cependant, un mod\xE8le encodeur-d\xE9codeur est \xE9galement plus lent car le processus de d\xE9codage se produit une \xE9tape \xE0 la fois, plut\xF4t que tout \xE0 la fois. Plus la s\xE9quence est longue, plus la pr\xE9diction est lente. Les mod\xE8les autor\xE9gressifs peuvent \xE9galement rester bloqu\xE9s dans des r\xE9p\xE9titions ou sauter des mots. Des techniques telles que la recherche en faisceau peuvent aider \xE0 am\xE9liorer la qualit\xE9 des pr\xE9dictions, mais aussi ralentir encore plus le d\xE9codage.`),this.h()},l(e){const u=Wn('[data-svelte="svelte-1phssyn"]',document.head);c=a(u,"META",{name:!0,content:!0}),u.forEach(s),q=f(e),h=a(e,"H1",{class:!0});var Q=l(h);T=a(Q,"A",{id:!0,class:!0,href:!0});var Ve=l(T);de=a(Ve,"SPAN",{});var Be=l(de);Y(W.$$.fragment,Be),Be.forEach(s),Ve.forEach(s),_t=f(Q),ce=a(Q,"SPAN",{});var Fs=l(ce);Et=r(Fs,"Architectures Seq2Seq"),Fs.forEach(s),Q.forEach(s),Je=f(e),_=a(e,"P",{});var D=l(_);$t=r(D,"Les mod\xE8les avec CTC abord\xE9s dans la section pr\xE9c\xE9dente utilisent uniquement la partie encodeur du "),me=a(D,"EM",{});var Ks=l(me);bt=r(Ks,"transformer"),Ks.forEach(s),xt=r(D,". Lorsque nous ajoutons \xE9galement le d\xE9codeur pour cr\xE9er un mod\xE8le encodeur-d\xE9codeur, on parle alors de mod\xE8le "),pe=a(D,"STRONG",{});var Qs=l(pe);Ct=r(Qs,"s\xE9quence \xE0 s\xE9quence"),Qs.forEach(s),yt=r(D,` ou seq2seq en abr\xE9g\xE9. Le mod\xE8le essocie une s\xE9quence d\u2019un type de donn\xE9es \xE0 une s\xE9quence d\u2019un autre type de donn\xE9es.
Avec les `),fe=a(D,"EM",{});var Xs=l(fe);St=r(Xs,"transformers"),Xs.forEach(s),Lt=r(D,` encodeur, l\u2019encodeur fait une pr\xE9diction pour chaque \xE9l\xE9ment de la s\xE9quence d\u2019entr\xE9e. Par cons\xE9quent, les s\xE9quences d\u2019entr\xE9e et de sortie auront toujours la m\xEAme longueur. Dans le cas de mod\xE8les avec CTC tels que Wav2Vec2, la forme d\u2019onde d\u2019entr\xE9e est d\u2019abord sous-\xE9chantillonn\xE9e, mais il y a toujours une pr\xE9diction pour chaque 20 ms d\u2019audio.
Avec un mod\xE8le seq2seq, il n\u2019y a pas une telle correspondance un-\xE0-un et les s\xE9quences d\u2019entr\xE9e et de sortie peuvent avoir des longueurs diff\xE9rentes. Cela rend les mod\xE8les seq2seq adapt\xE9s aux t\xE2ches de NLP telles que le r\xE9sum\xE9 de texte ou la traduction entre diff\xE9rentes langues, mais aussi aux t\xE2ches audio telles que la reconnaissance vocale.
L\u2019architecture d\u2019un d\xE9codeur est tr\xE8s similaire \xE0 celle d\u2019un encodeur, et les deux utilisent des couches similaires avec l\u2019auto-attention comme caract\xE9ristique principale. Toutefois, le d\xE9codeur effectue une t\xE2che diff\xE9rente de celle de l\u2019encodeur. Pour voir comment cela fonctionne, examinons comment un mod\xE8le seq2seq peut effectuer une reconnaissance automatique de la parole.`),D.forEach(s),Fe=f(e),y=a(e,"H2",{class:!0});var mt=l(y);k=a(mt,"A",{id:!0,class:!0,href:!0});var Ys=l(k);qe=a(Ys,"SPAN",{});var Zs=l(qe);Y(U.$$.fragment,Zs),Zs.forEach(s),Ys.forEach(s),wt=f(mt),ve=a(mt,"SPAN",{});var en=l(ve);Tt=r(en,"Reconnaissance automatique de la parole"),en.forEach(s),mt.forEach(s),Ke=f(e),b=a(e,"P",{});var ue=l(b);kt=r(ue,"L\u2019architecture de "),he=a(ue,"STRONG",{});var tn=l(he);At=r(tn,"Whisper"),tn.forEach(s),Pt=r(ue," est la suivante (figure provenant du blog d\u2019"),z=a(ue,"A",{href:!0,rel:!0});var sn=l(z);Mt=r(sn,"OpenAI"),sn.forEach(s),Nt=r(ue,") :"),ue.forEach(s),Qe=f(e),H=a(e,"DIV",{class:!0});var nn=l(H);ne=a(nn,"IMG",{src:!0,alt:!0}),nn.forEach(s),Xe=f(e),A=a(e,"P",{});var pt=l(A);Rt=r(pt,"Cela devrait vous sembler assez familier. Sur la gauche se trouve l\u2019"),re=a(pt,"STRONG",{});var zs=l(re);It=r(zs,"encodeur du "),ge=a(zs,"EM",{});var rn=l(ge);Ot=r(rn,"transformer"),rn.forEach(s),zs.forEach(s),Dt=r(pt,". Il prend comme entr\xE9e un spectrogramme log-mel et encode ce spectrogramme pour former une s\xE9quence d\u2019\xE9tats cach\xE9s de l\u2019encodeur qui extraient des caract\xE9ristiques importantes de la parole. Ce tenseur \xE0 \xE9tats cach\xE9s repr\xE9sente la s\xE9quence d\u2019entr\xE9e dans son ensemble et code efficacement le \xAB sens \xBB du discours d\u2019entr\xE9e."),pt.forEach(s),Ye=f(e),Y(P.$$.fragment,e),Ze=f(e),m=a(e,"P",{});var v=l(m);Gt=r(v,"La sortie de l\u2019encodeur est ensuite pass\xE9e dans le "),oe=a(v,"STRONG",{});var Hs=l(oe);jt=r(Hs,"d\xE9codeur du "),_e=a(Hs,"EM",{});var on=l(_e);Wt=r(on,"transformer"),on.forEach(s),Hs.forEach(s),Ut=r(v,", illustr\xE9 \xE0 droite, \xE0 l\u2019aide d\u2019un m\xE9canisme d\u2019"),Ee=a(v,"STRONG",{});var an=l(Ee);zt=r(an,"attention crois\xE9e"),an.forEach(s),Ht=r(v,`. C\u2019est comme l\u2019auto-attention, mais assiste la sortie de l\u2019encodeur. \xC0 partir de ce moment, l\u2019encodeur n\u2019est plus n\xE9cessaire.
Le d\xE9codeur pr\xE9dit une s\xE9quence de `),$e=a(v,"EM",{});var ln=l($e);Vt=r(ln,"tokens"),ln.forEach(s),Bt=r(v," de texte de mani\xE8re "),be=a(v,"STRONG",{});var un=l(be);Jt=r(un,"autor\xE9gressive"),un.forEach(s),Ft=r(v,", un seul "),xe=a(v,"EM",{});var dn=l(xe);Kt=r(dn,"token"),dn.forEach(s),Qt=r(v," \xE0 la fois, \xE0 partir d\u2019une s\xE9quence initiale qui contient juste un "),Ce=a(v,"EM",{});var cn=l(Ce);Xt=r(cn,"token"),cn.forEach(s),Yt=r(v," \xAB start \xBB ("),ye=a(v,"CODE",{});var mn=l(ye);Zt=r(mn,"SOT"),mn.forEach(s),es=r(v," dans le cas de Whisper). \xC0 chaque pas de temps suivant, la s\xE9quence de sortie pr\xE9c\xE9dente est r\xE9introduite dans le d\xE9codeur en tant que nouvelle s\xE9quence d\u2019entr\xE9e. De cette mani\xE8re, le d\xE9codeur \xE9met un nouveau "),Se=a(v,"EM",{});var pn=l(Se);ts=r(pn,"token"),pn.forEach(s),ss=r(v," \xE0 la fois, augmentant r\xE9guli\xE8rement la s\xE9quence de sortie, jusqu\u2019\xE0 ce qu\u2019il pr\xE9dise qu\u2019un "),Le=a(v,"EM",{});var fn=l(Le);ns=r(fn,"token"),fn.forEach(s),rs=r(v,` de fin ou un nombre maximum de pas de temps est atteint.
Alors que l\u2019architecture du d\xE9codeur est en grande partie identique \xE0 celle de l\u2019encodeur, il existe deux grandes diff\xE9rences:`),v.forEach(s),et=f(e),M=a(e,"OL",{});var ft=l(M);we=a(ft,"LI",{});var qn=l(we);os=r(qn,"Le d\xE9codeur a un m\xE9canisme d\u2019attention crois\xE9e qui lui permet de regarder la repr\xE9sentation de l\u2019encodeur de la s\xE9quence d\u2019entr\xE9e"),qn.forEach(s),as=f(ft),V=a(ft,"LI",{});var qt=l(V);ls=r(qt,`L\u2019attention du d\xE9codeur est causale : le d\xE9codeur n\u2019est pas autoris\xE9 \xE0 regarder vers l\u2019avenir.
Dans cette conception, le d\xE9codeur joue le r\xF4le d\u2019un `),Te=a(qt,"STRONG",{});var vn=l(Te);us=r(vn,"mod\xE8le de langage"),vn.forEach(s),is=r(qt,", traitant les repr\xE9sentations \xE0 l\u2019\xE9tat cach\xE9 de l\u2019encodeur et g\xE9n\xE9rant les transcriptions de texte correspondantes. Il s\u2019agit d\u2019une approche plus puissante que la CTC (m\xEAme si la CTC est combin\xE9e avec un mod\xE8le de langage externe), car le syst\xE8me seq2seq peut \xEAtre entra\xEEn\xE9 de bout en bout avec les m\xEAmes donn\xE9es d\u2019apprentissage et la m\xEAme fonction de perte, offrant une plus grande flexibilit\xE9 et des performances g\xE9n\xE9ralement sup\xE9rieures."),qt.forEach(s),ft.forEach(s),tt=f(e),Y(N.$$.fragment,e),st=f(e),E=a(e,"P",{});var G=l(E);ds=r(G,"Une fonction de perte typique pour un mod\xE8le d\u2019ASR seq2seq est la perte d\u2019entropie crois\xE9e car la derni\xE8re couche du mod\xE8le pr\xE9dit une distribution de probabilit\xE9 sur les "),ke=a(G,"EM",{});var hn=l(ke);cs=r(hn,"tokens"),hn.forEach(s),ms=r(G," possibles. Ceci est g\xE9n\xE9ralement combin\xE9 avec des techniques telles que "),B=a(G,"A",{href:!0,rel:!0});var gn=l(B);ps=r(gn,"recherche en faisceau pour g\xE9n\xE9rer la s\xE9quence finale"),gn.forEach(s),fs=r(G,". La m\xE9trique de la reconnaissance vocale est le WER ("),Ae=a(G,"EM",{});var _n=l(Ae);qs=r(_n,"word error rate"),_n.forEach(s),vs=r(G,") ou taux d\u2019erreur de mots, qui mesure le nombre de substitutions, d\u2019insertions et de suppressions n\xE9cessaires pour transformer le texte pr\xE9dit en texte cible. Moins il y en a, meilleur est le score."),G.forEach(s),nt=f(e),S=a(e,"H2",{class:!0});var vt=l(S);R=a(vt,"A",{id:!0,class:!0,href:!0});var En=l(R);Pe=a(En,"SPAN",{});var $n=l(Pe);Y(J.$$.fragment,$n),$n.forEach(s),En.forEach(s),hs=f(vt),Me=a(vt,"SPAN",{});var bn=l(Me);gs=r(bn,"Synth\xE8se vocale"),bn.forEach(s),vt.forEach(s),rt=f(e),$=a(e,"P",{});var j=l($);_s=r(j,"Cela ne vous surprendra peut-\xEAtre pas : un mod\xE8le seq2seq pour la synth\xE8se vocale fonctionne essentiellement de la m\xEAme mani\xE8re que d\xE9crit ci-dessus, mais avec les entr\xE9es et les sorties invers\xE9es ! L\u2019encodeur du "),Ne=a(j,"EM",{});var xn=l(Ne);Es=r(xn,"transformer"),xn.forEach(s),$s=r(j," prend une s\xE9quence de "),Re=a(j,"EM",{});var Cn=l(Re);bs=r(Cn,"tokens"),Cn.forEach(s),xs=r(j," de texte et extrait une s\xE9quence d\u2019\xE9tats masqu\xE9s qui repr\xE9sentent le texte d\u2019entr\xE9e. Le d\xE9codeur du "),Ie=a(j,"EM",{});var yn=l(Ie);Cs=r(yn,"transformer"),yn.forEach(s),ys=r(j," applique une attention crois\xE9e \xE0 la sortie de l\u2019encodeur et pr\xE9dit un spectrogramme."),j.forEach(s),ot=f(e),Y(I.$$.fragment,e),at=f(e),x=a(e,"P",{});var ie=l(x);Ss=r(ie,"Avec le mod\xE8le d\u2019ASR, le d\xE9codeur a \xE9t\xE9 d\xE9marr\xE9 \xE0 l\u2019aide d\u2019une s\xE9quence qui contient simplement le "),Oe=a(ie,"EM",{});var Sn=l(Oe);Ls=r(Sn,"token"),Sn.forEach(s),ws=r(ie," sp\xE9cial \xAB start \xBB. Pour le mod\xE8le de synth\xE8se vocale, on peut commencer le d\xE9codage avec un spectrogramme de longueur 1 et rempli de 0 qui agit comme le \xAB "),De=a(ie,"EM",{});var Ln=l(De);Ts=r(Ln,"token"),Ln.forEach(s),ks=r(ie," de d\xE9part \xBB. Compte tenu de ce spectrogramme initial et des attentions crois\xE9es sur les repr\xE9sentations \xE0 l\u2019\xE9tat cach\xE9 de l\u2019encodeur, le d\xE9codeur pr\xE9dit ensuite la prochaine tranche de temps pour ce spectrogramme, augmentant r\xE9guli\xE8rement le spectrogramme un pas de temps \xE0 la fois."),ie.forEach(s),lt=f(e),F=a(e,"DIV",{class:!0});var wn=l(F);ae=a(wn,"IMG",{src:!0,alt:!0}),wn.forEach(s),ut=f(e),g=a(e,"P",{});var C=l(g);As=r(C,"Mais comment le d\xE9codeur sait-il quand s\u2019arr\xEAter ? Dans le mod\xE8le "),Ge=a(C,"STRONG",{});var Tn=l(Ge);Ps=r(Tn,"SpeechT5"),Tn.forEach(s),Ms=r(C,`, cela est g\xE9r\xE9 en faisant pr\xE9dire au d\xE9codeur une deuxi\xE8me s\xE9quence. Il contient la probabilit\xE9 que le pas de temps actuel soit le dernier. Lors de la g\xE9n\xE9ration audio au moment de l\u2019inf\xE9rence, si cette probabilit\xE9 d\xE9passe un certain seuil (disons 0,5), le d\xE9codeur indique que le spectrogramme est termin\xE9 et que la boucle de g\xE9n\xE9ration doit se terminer.
Une fois le d\xE9codage termin\xE9 et que nous avons une s\xE9quence de sortie contenant le spectrogramme, SpeechT5 utilise un `),je=a(C,"STRONG",{});var kn=l(je);Ns=r(kn,"post-net"),kn.forEach(s),Rs=r(C,` qui est compos\xE9 de plusieurs couches de convolution pour affiner le spectrogramme.
Lors de l\u2019entra\xEEnement du mod\xE8le de synth\xE8se vocale, les cibles sont aussi des spectrogrammes et la perte est la L1 ou la MSE. Au moment de l\u2019inf\xE9rence, nous voulons convertir le spectrogramme de sortie en une forme d\u2019onde audio afin que nous puissions r\xE9ellement l\u2019\xE9couter. Pour cela, un mod\xE8le externe est utilis\xE9, le `),We=a(C,"STRONG",{});var An=l(We);Is=r(An,"vocodeur"),An.forEach(s),Os=r(C,`. Ce vocodeur ne fait pas partie de l\u2019architecture seq2seq et est entra\xEEn\xE9 s\xE9par\xE9ment.
Ce qui rend la synth\xE8se vocale difficile, est qu\u2019il s\u2019agit d\u2019une association un-\xE0-plusieurs. Avec la reconnaissance de la parole, il n\u2019y a qu\u2019un seul texte de sortie correct correspondant au discours d\u2019entr\xE9e, mais avec la synth\xE8se vocale, le texte d\u2019entr\xE9e peut \xEAtre associ\xE9 \xE0 de nombreux sons possibles. Diff\xE9rents orateurs peuvent choisir de mettre l\u2019accent sur diff\xE9rentes parties de la phrase, par exemple. Cela rend les mod\xE8les de synth\xE8se vocale difficiles \xE0 \xE9valuer. Pour cette raison, la valeur de perte L1 ou MSE n\u2019est pas vraiment significative : il existe plusieurs fa\xE7ons de repr\xE9senter le m\xEAme texte dans un spectrogramme. C\u2019est pourquoi les mod\xE8les TTS sont g\xE9n\xE9ralement \xE9valu\xE9s par des auditeurs humains, en utilisant une m\xE9trique connue sous le nom de MOS (`),Ue=a(C,"EM",{});var Pn=l(Ue);Ds=r(Pn,"mean opinion score"),Pn.forEach(s),Gs=r(C,") ou score d\u2019opinion moyen."),C.forEach(s),it=f(e),L=a(e,"H2",{class:!0});var ht=l(L);O=a(ht,"A",{id:!0,class:!0,href:!0});var Mn=l(O);ze=a(Mn,"SPAN",{});var Nn=l(ze);Y(K.$$.fragment,Nn),Nn.forEach(s),Mn.forEach(s),js=f(ht),He=a(ht,"SPAN",{});var Rn=l(He);Ws=r(Rn,"Conclusion"),Rn.forEach(s),ht.forEach(s),dt=f(e),le=a(e,"P",{});var In=l(le);Us=r(In,`L\u2019approche seq2seq est plus puissante qu\u2019un mod\xE8le d\u2019encodeur. En s\xE9parant l\u2019encodage de la s\xE9quence d\u2019entr\xE9e du d\xE9codage de la s\xE9quence de sortie, l\u2019alignement de l\u2019audio et du texte est moins probl\xE9matique.  Le mod\xE8le apprend \xE0 effectuer cet alignement gr\xE2ce au m\xE9canisme d\u2019attention.
Cependant, un mod\xE8le encodeur-d\xE9codeur est \xE9galement plus lent car le processus de d\xE9codage se produit une \xE9tape \xE0 la fois, plut\xF4t que tout \xE0 la fois. Plus la s\xE9quence est longue, plus la pr\xE9diction est lente. Les mod\xE8les autor\xE9gressifs peuvent \xE9galement rester bloqu\xE9s dans des r\xE9p\xE9titions ou sauter des mots. Des techniques telles que la recherche en faisceau peuvent aider \xE0 am\xE9liorer la qualit\xE9 des pr\xE9dictions, mais aussi ralentir encore plus le d\xE9codage.`),In.forEach(s),this.h()},h(){d(c,"name","hf:doc:metadata"),d(c,"content",JSON.stringify(Jn)),d(T,"id","architectures-seq2seq"),d(T,"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"),d(T,"href","#architectures-seq2seq"),d(h,"class","relative group"),d(k,"id","reconnaissance-automatique-de-la-parole"),d(k,"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"),d(k,"href","#reconnaissance-automatique-de-la-parole"),d(y,"class","relative group"),d(z,"href","https://openai.com/blog/whisper/"),d(z,"rel","nofollow"),On(ne.src,Bs="https://huggingface.co/blog/assets/111_fine_tune_whisper/whisper_architecture.svg")||d(ne,"src",Bs),d(ne,"alt","Whisper is a transformer encoder-decoder model"),d(H,"class","flex justify-center"),d(B,"href","https://huggingface.co/blog/how-to-generate"),d(B,"rel","nofollow"),d(R,"id","synthse-vocale"),d(R,"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"),d(R,"href","#synthse-vocale"),d(S,"class","relative group"),On(ae.src,Js="https://huggingface.co/datasets/huggingface-course/audio-course-images/resolve/main/speecht5_decoding.png")||d(ae,"src",Js),d(ae,"alt","The audio waveform gets mapped to a shorter sequence of hidden-states"),d(F,"class","flex justify-center"),d(O,"id","conclusion"),d(O,"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"),d(O,"href","#conclusion"),d(L,"class","relative group")},m(e,u){t(document.head,c),i(e,q,u),i(e,h,u),t(h,T),t(T,de),Z(W,de,null),t(h,_t),t(h,ce),t(ce,Et),i(e,Je,u),i(e,_,u),t(_,$t),t(_,me),t(me,bt),t(_,xt),t(_,pe),t(pe,Ct),t(_,yt),t(_,fe),t(fe,St),t(_,Lt),i(e,Fe,u),i(e,y,u),t(y,k),t(k,qe),Z(U,qe,null),t(y,wt),t(y,ve),t(ve,Tt),i(e,Ke,u),i(e,b,u),t(b,kt),t(b,he),t(he,At),t(b,Pt),t(b,z),t(z,Mt),t(b,Nt),i(e,Qe,u),i(e,H,u),t(H,ne),i(e,Xe,u),i(e,A,u),t(A,Rt),t(A,re),t(re,It),t(re,ge),t(ge,Ot),t(A,Dt),i(e,Ye,u),Z(P,e,u),i(e,Ze,u),i(e,m,u),t(m,Gt),t(m,oe),t(oe,jt),t(oe,_e),t(_e,Wt),t(m,Ut),t(m,Ee),t(Ee,zt),t(m,Ht),t(m,$e),t($e,Vt),t(m,Bt),t(m,be),t(be,Jt),t(m,Ft),t(m,xe),t(xe,Kt),t(m,Qt),t(m,Ce),t(Ce,Xt),t(m,Yt),t(m,ye),t(ye,Zt),t(m,es),t(m,Se),t(Se,ts),t(m,ss),t(m,Le),t(Le,ns),t(m,rs),i(e,et,u),i(e,M,u),t(M,we),t(we,os),t(M,as),t(M,V),t(V,ls),t(V,Te),t(Te,us),t(V,is),i(e,tt,u),Z(N,e,u),i(e,st,u),i(e,E,u),t(E,ds),t(E,ke),t(ke,cs),t(E,ms),t(E,B),t(B,ps),t(E,fs),t(E,Ae),t(Ae,qs),t(E,vs),i(e,nt,u),i(e,S,u),t(S,R),t(R,Pe),Z(J,Pe,null),t(S,hs),t(S,Me),t(Me,gs),i(e,rt,u),i(e,$,u),t($,_s),t($,Ne),t(Ne,Es),t($,$s),t($,Re),t(Re,bs),t($,xs),t($,Ie),t(Ie,Cs),t($,ys),i(e,ot,u),Z(I,e,u),i(e,at,u),i(e,x,u),t(x,Ss),t(x,Oe),t(Oe,Ls),t(x,ws),t(x,De),t(De,Ts),t(x,ks),i(e,lt,u),i(e,F,u),t(F,ae),i(e,ut,u),i(e,g,u),t(g,As),t(g,Ge),t(Ge,Ps),t(g,Ms),t(g,je),t(je,Ns),t(g,Rs),t(g,We),t(We,Is),t(g,Os),t(g,Ue),t(Ue,Ds),t(g,Gs),i(e,it,u),i(e,L,u),t(L,O),t(O,ze),Z(K,ze,null),t(L,js),t(L,He),t(He,Ws),i(e,dt,u),i(e,le,u),t(le,Us),ct=!0},p(e,[u]){const Q={};u&2&&(Q.$$scope={dirty:u,ctx:e}),P.$set(Q);const Ve={};u&2&&(Ve.$$scope={dirty:u,ctx:e}),N.$set(Ve);const Be={};u&2&&(Be.$$scope={dirty:u,ctx:e}),I.$set(Be)},i(e){ct||(ee(W.$$.fragment,e),ee(U.$$.fragment,e),ee(P.$$.fragment,e),ee(N.$$.fragment,e),ee(J.$$.fragment,e),ee(I.$$.fragment,e),ee(K.$$.fragment,e),ct=!0)},o(e){te(W.$$.fragment,e),te(U.$$.fragment,e),te(P.$$.fragment,e),te(N.$$.fragment,e),te(J.$$.fragment,e),te(I.$$.fragment,e),te(K.$$.fragment,e),ct=!1},d(e){s(c),e&&s(q),e&&s(h),se(W),e&&s(Je),e&&s(_),e&&s(Fe),e&&s(y),se(U),e&&s(Ke),e&&s(b),e&&s(Qe),e&&s(H),e&&s(Xe),e&&s(A),e&&s(Ye),se(P,e),e&&s(Ze),e&&s(m),e&&s(et),e&&s(M),e&&s(tt),se(N,e),e&&s(st),e&&s(E),e&&s(nt),e&&s(S),se(J),e&&s(rt),e&&s($),e&&s(ot),se(I,e),e&&s(at),e&&s(x),e&&s(lt),e&&s(F),e&&s(ut),e&&s(g),e&&s(it),e&&s(L),se(K),e&&s(dt),e&&s(le)}}}const Jn={local:"architectures-seq2seq",sections:[{local:"reconnaissance-automatique-de-la-parole",title:"Reconnaissance automatique de la parole"},{local:"synthse-vocale",title:"Synth\xE8se vocale"},{local:"conclusion",title:"Conclusion"}],title:"Architectures Seq2Seq"};function Fn(w){return Un(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class Yn extends Dn{constructor(c){super();Gn(this,c,Fn,Bn,jn,{})}}export{Yn as default,Jn as metadata};
