import{s as Pe,o as we}from"../chunks/scheduler.f7e1785c.js";import{S as Se,i as ke,g as l,s as u,r as h,A as Ae,h as i,f as s,c as a,j as He,u as $,x as d,k as le,y as Ee,a as n,v as x,d as C,t as T,w as b,m as ce,n as me}from"../chunks/index.9f8f0838.js";import{T as de}from"../chunks/Tip.4575d9cf.js";import{H as ie,E as je}from"../chunks/getInferenceSnippets.ba5f4cd0.js";function Ie(m){let r;return{c(){r=ce("💡 Il est courant que ces modèles seq2seq utilisent des spectrogrammes comme entrée. Cependant, un modèle seq2seq peut également être conçu pour fonctionner directement sur les formes d'onde audio.")},l(o){r=me(o,"💡 Il est courant que ces modèles seq2seq utilisent des spectrogrammes comme entrée. Cependant, un modèle seq2seq peut également être conçu pour fonctionner directement sur les formes d'onde audio.")},m(o,c){n(o,r,c)},d(o){o&&s(r)}}}function ze(m){let r;return{c(){r=ce("💡 Alors qu'un modèle avec CTC produit une séquence de caractères individuels, les *tokens* prédits par Whisper sont des mots complets ou des portions de mots. Il utilise le tokenizer de GPT-2 et dispose d’environ 50 000 *tokens* uniques. Un modèle seq2seq peut donc produire une séquence beaucoup plus courte qu'un modèle CTC pour la même transcription.")},l(o){r=me(o,"💡 Alors qu'un modèle avec CTC produit une séquence de caractères individuels, les *tokens* prédits par Whisper sont des mots complets ou des portions de mots. Il utilise le tokenizer de GPT-2 et dispose d’environ 50 000 *tokens* uniques. Un modèle seq2seq peut donc produire une séquence beaucoup plus courte qu'un modèle CTC pour la même transcription.")},m(o,c){n(o,r,c)},d(o){o&&s(r)}}}function De(m){let r;return{c(){r=ce("💡 Rappelons qu'un spectrogramme est fabriqué en prenant le spectre de fréquences 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équence où les éléments sont des spectres de fréquence (log-mel), un pour chaque pas de temps.")},l(o){r=me(o,"💡 Rappelons qu'un spectrogramme est fabriqué en prenant le spectre de fréquences 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équence où les éléments sont des spectres de fréquence (log-mel), un pour chaque pas de temps.")},m(o,c){n(o,r,c)},d(o){o&&s(r)}}}function Re(m){let r,o,c,W,_,O,L,pe=`Les modèles avec CTC abordés dans la section précédente utilisent uniquement la partie encodeur du <em>transformer</em>. Lorsque nous ajoutons également le décodeur pour créer un modèle encodeur-décodeur, on parle alors de modèle <strong>séquence à séquence</strong> ou seq2seq en abrégé. Le modèle essocie une séquence d’un type de données à une séquence d’un autre type de données.
Avec les <em>transformers</em> encodeur, l’encodeur fait une prédiction pour chaque élément de la séquence d’entrée. Par conséquent, les séquences d’entrée et de sortie auront toujours la même longueur. Dans le cas de modèles avec CTC tels que Wav2Vec2, la forme d’onde d’entrée est d’abord sous-échantillonnée, mais il y a toujours une prédiction pour chaque 20 ms d’audio.
Avec un modèle seq2seq, il n’y a pas une telle correspondance un-à-un et les séquences d’entrée et de sortie peuvent avoir des longueurs différentes. Cela rend les modèles seq2seq adaptés aux tâches de NLP telles que le résumé de texte ou la traduction entre différentes langues, mais aussi aux tâches audio telles que la reconnaissance vocale.
L’architecture d’un décodeur est très similaire à celle d’un encodeur, et les deux utilisent des couches similaires avec l’auto-attention comme caractéristique principale. Toutefois, le décodeur effectue une tâche différente de celle de l’encodeur. Pour voir comment cela fonctionne, examinons comment un modèle seq2seq peut effectuer une reconnaissance automatique de la parole.`,U,M,G,y,fe='L’architecture de <strong>Whisper</strong> est la suivante (figure provenant du blog d’<a href="https://openai.com/blog/whisper/" rel="nofollow">OpenAI</a>) :',V,p,qe='<img src="https://huggingface.co/blog/assets/111_fine_tune_whisper/whisper_architecture.svg" alt="Whisper is a transformer encoder-decoder model"/>',N,H,ge="Cela devrait vous sembler assez familier. Sur la gauche se trouve l’<strong>encodeur du <em>transformer</em></strong>. Il prend comme entrée un spectrogramme log-mel et encode ce spectrogramme pour former une séquence d’états cachés de l’encodeur qui extraient des caractéristiques importantes de la parole. Ce tenseur à états cachés représente la séquence d’entrée dans son ensemble et code efficacement le « sens » du discours d’entrée.",B,f,F,P,ve=`La sortie de l’encodeur est ensuite passée dans le <strong>décodeur du <em>transformer</em></strong>, illustré à droite, à l’aide d’un mécanisme d’<strong>attention croisée</strong>. C’est comme l’auto-attention, mais assiste la sortie de l’encodeur. À partir de ce moment, l’encodeur n’est plus nécessaire.
Le décodeur prédit une séquence de <em>tokens</em> de texte de manière <strong>autorégressive</strong>, un seul <em>token</em> à la fois, à partir d’une séquence initiale qui contient juste un <em>token</em> « start » (<code>SOT</code> dans le cas de Whisper). À chaque pas de temps suivant, la séquence de sortie précédente est réintroduite dans le décodeur en tant que nouvelle séquence d’entrée. De cette manière, le décodeur émet un nouveau <em>token</em> à la fois, augmentant régulièrement la séquence de sortie, jusqu’à ce qu’il prédise qu’un <em>token</em> de fin ou un nombre maximum de pas de temps est atteint.
Alors que l’architecture du décodeur est en grande partie identique à celle de l’encodeur, il existe deux grandes différences:`,J,w,he=`<li>Le décodeur a un mécanisme d’attention croisée qui lui permet de regarder la représentation de l’encodeur de la séquence d’entrée</li> <li>L’attention du décodeur est causale : le décodeur n’est pas autorisé à regarder vers l’avenir.
Dans cette conception, le décodeur joue le rôle d’un <strong>modèle de langage</strong>, traitant les représentations à l’état caché de l’encodeur et générant les transcriptions de texte correspondantes. Il s’agit d’une approche plus puissante que la CTC (même si la CTC est combinée avec un modèle de langage externe), car le système seq2seq peut être entraîné de bout en bout avec les mêmes données d’apprentissage et la même fonction de perte, offrant une plus grande flexibilité et des performances généralement supérieures.</li>`,K,q,Q,S,$e='Une fonction de perte typique pour un modèle d’ASR seq2seq est la perte d’entropie croisée car la dernière couche du modèle prédit une distribution de probabilité sur les <em>tokens</em> possibles. Ceci est généralement combiné avec des techniques telles que <a href="https://huggingface.co/blog/how-to-generate" rel="nofollow">recherche en faisceau pour générer la séquence finale</a>. La métrique de la reconnaissance vocale est le WER (<em>word error rate</em>) ou taux d’erreur de mots, qui mesure le nombre de substitutions, d’insertions et de suppressions nécessaires pour transformer le texte prédit en texte cible. Moins il y en a, meilleur est le score.',X,k,Y,A,xe="Cela ne vous surprendra peut-être pas : un modèle seq2seq pour la synthèse vocale fonctionne essentiellement de la même manière que décrit ci-dessus, mais avec les entrées et les sorties inversées ! L’encodeur du <em>transformer</em> prend une séquence de <em>tokens</em> de texte et extrait une séquence d’états masqués qui représentent le texte d’entrée. Le décodeur du <em>transformer</em> applique une attention croisée à la sortie de l’encodeur et prédit un spectrogramme.",Z,g,ee,E,Ce="Avec le modèle d’ASR, le décodeur a été démarré à l’aide d’une séquence qui contient simplement le <em>token</em> spécial « start ». Pour le modèle de synthèse vocale, on peut commencer le décodage avec un spectrogramme de longueur 1 et rempli de 0 qui agit comme le « <em>token</em> de départ ». Compte tenu de ce spectrogramme initial et des attentions croisées sur les représentations à l’état caché de l’encodeur, le décodeur prédit ensuite la prochaine tranche de temps pour ce spectrogramme, augmentant régulièrement le spectrogramme un pas de temps à la fois.",te,v,Te='<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"/>',se,j,be=`Mais comment le décodeur sait-il quand s’arrêter ? Dans le modèle <strong>SpeechT5</strong>, cela est géré en faisant prédire au décodeur une deuxième séquence. Il contient la probabilité que le pas de temps actuel soit le dernier. Lors de la génération audio au moment de l’inférence, si cette probabilité dépasse un certain seuil (disons 0,5), le décodeur indique que le spectrogramme est terminé et que la boucle de génération doit se terminer.
Une fois le décodage terminé et que nous avons une séquence de sortie contenant le spectrogramme, SpeechT5 utilise un <strong>post-net</strong> qui est composé de plusieurs couches de convolution pour affiner le spectrogramme.
Lors de l’entraînement du modèle de synthèse vocale, les cibles sont aussi des spectrogrammes et la perte est la L1 ou la MSE. Au moment de l’inférence, nous voulons convertir le spectrogramme de sortie en une forme d’onde audio afin que nous puissions réellement l’écouter. Pour cela, un modèle externe est utilisé, le <strong>vocodeur</strong>. Ce vocodeur ne fait pas partie de l’architecture seq2seq et est entraîné séparément.
Ce qui rend la synthèse vocale difficile, est qu’il s’agit d’une association un-à-plusieurs. Avec la reconnaissance de la parole, il n’y a qu’un seul texte de sortie correct correspondant au discours d’entrée, mais avec la synthèse vocale, le texte d’entrée peut être associé à de nombreux sons possibles. Différents orateurs peuvent choisir de mettre l’accent sur différentes parties de la phrase, par exemple. Cela rend les modèles de synthèse vocale difficiles à évaluer. Pour cette raison, la valeur de perte L1 ou MSE n’est pas vraiment significative : il existe plusieurs façons de représenter le même texte dans un spectrogramme. C’est pourquoi les modèles TTS sont généralement évalués par des auditeurs humains, en utilisant une métrique connue sous le nom de MOS (<em>mean opinion score</em>) ou score d’opinion moyen.`,ne,I,re,z,_e=`L’approche seq2seq est plus puissante qu’un modèle d’encodeur. En séparant l’encodage de la séquence d’entrée du décodage de la séquence de sortie, l’alignement de l’audio et du texte est moins problématique.  Le modèle apprend à effectuer cet alignement grâce au mécanisme d’attention.
Cependant, un modèle encodeur-décodeur est également plus lent car le processus de décodage se produit une étape à la fois, plutôt que tout à la fois. Plus la séquence est longue, plus la prédiction est lente. Les modèles autorégressifs peuvent également rester bloqués dans des répétitions ou sauter des mots. Des techniques telles que la recherche en faisceau peuvent aider à améliorer la qualité des prédictions, mais aussi ralentir encore plus le décodage.`,oe,D,ue,R,ae;return _=new ie({props:{title:"Architectures Seq2Seq",local:"architectures-seq2seq",headingTag:"h1"}}),M=new ie({props:{title:"Reconnaissance automatique de la parole",local:"reconnaissance-automatique-de-la-parole",headingTag:"h2"}}),f=new de({props:{$$slots:{default:[Ie]},$$scope:{ctx:m}}}),q=new de({props:{$$slots:{default:[ze]},$$scope:{ctx:m}}}),k=new ie({props:{title:"Synthèse vocale",local:"synthèse-vocale",headingTag:"h2"}}),g=new de({props:{$$slots:{default:[De]},$$scope:{ctx:m}}}),I=new ie({props:{title:"Conclusion",local:"conclusion",headingTag:"h2"}}),D=new je({props:{source:"https://github.com/huggingface/audio-transformers-course/blob/main/chapters/fr/chapter3/seq2seq.mdx"}}),{c(){r=l("meta"),o=u(),c=l("p"),W=u(),h(_.$$.fragment),O=u(),L=l("p"),L.innerHTML=pe,U=u(),h(M.$$.fragment),G=u(),y=l("p"),y.innerHTML=fe,V=u(),p=l("div"),p.innerHTML=qe,N=u(),H=l("p"),H.innerHTML=ge,B=u(),h(f.$$.fragment),F=u(),P=l("p"),P.innerHTML=ve,J=u(),w=l("ol"),w.innerHTML=he,K=u(),h(q.$$.fragment),Q=u(),S=l("p"),S.innerHTML=$e,X=u(),h(k.$$.fragment),Y=u(),A=l("p"),A.innerHTML=xe,Z=u(),h(g.$$.fragment),ee=u(),E=l("p"),E.innerHTML=Ce,te=u(),v=l("div"),v.innerHTML=Te,se=u(),j=l("p"),j.innerHTML=be,ne=u(),h(I.$$.fragment),re=u(),z=l("p"),z.textContent=_e,oe=u(),h(D.$$.fragment),ue=u(),R=l("p"),this.h()},l(e){const t=Ae("svelte-u9bgzb",document.head);r=i(t,"META",{name:!0,content:!0}),t.forEach(s),o=a(e),c=i(e,"P",{}),He(c).forEach(s),W=a(e),$(_.$$.fragment,e),O=a(e),L=i(e,"P",{"data-svelte-h":!0}),d(L)!=="svelte-1uizh2k"&&(L.innerHTML=pe),U=a(e),$(M.$$.fragment,e),G=a(e),y=i(e,"P",{"data-svelte-h":!0}),d(y)!=="svelte-13glvq2"&&(y.innerHTML=fe),V=a(e),p=i(e,"DIV",{class:!0,"data-svelte-h":!0}),d(p)!=="svelte-1402zsk"&&(p.innerHTML=qe),N=a(e),H=i(e,"P",{"data-svelte-h":!0}),d(H)!=="svelte-1w933iz"&&(H.innerHTML=ge),B=a(e),$(f.$$.fragment,e),F=a(e),P=i(e,"P",{"data-svelte-h":!0}),d(P)!=="svelte-alze8h"&&(P.innerHTML=ve),J=a(e),w=i(e,"OL",{"data-svelte-h":!0}),d(w)!=="svelte-1mj5i09"&&(w.innerHTML=he),K=a(e),$(q.$$.fragment,e),Q=a(e),S=i(e,"P",{"data-svelte-h":!0}),d(S)!=="svelte-mjeihy"&&(S.innerHTML=$e),X=a(e),$(k.$$.fragment,e),Y=a(e),A=i(e,"P",{"data-svelte-h":!0}),d(A)!=="svelte-sgypc3"&&(A.innerHTML=xe),Z=a(e),$(g.$$.fragment,e),ee=a(e),E=i(e,"P",{"data-svelte-h":!0}),d(E)!=="svelte-12ao7xs"&&(E.innerHTML=Ce),te=a(e),v=i(e,"DIV",{class:!0,"data-svelte-h":!0}),d(v)!=="svelte-1886deo"&&(v.innerHTML=Te),se=a(e),j=i(e,"P",{"data-svelte-h":!0}),d(j)!=="svelte-1v9h4f2"&&(j.innerHTML=be),ne=a(e),$(I.$$.fragment,e),re=a(e),z=i(e,"P",{"data-svelte-h":!0}),d(z)!=="svelte-1stqyyn"&&(z.textContent=_e),oe=a(e),$(D.$$.fragment,e),ue=a(e),R=i(e,"P",{}),He(R).forEach(s),this.h()},h(){le(r,"name","hf:doc:metadata"),le(r,"content",We),le(p,"class","flex justify-center"),le(v,"class","flex justify-center")},m(e,t){Ee(document.head,r),n(e,o,t),n(e,c,t),n(e,W,t),x(_,e,t),n(e,O,t),n(e,L,t),n(e,U,t),x(M,e,t),n(e,G,t),n(e,y,t),n(e,V,t),n(e,p,t),n(e,N,t),n(e,H,t),n(e,B,t),x(f,e,t),n(e,F,t),n(e,P,t),n(e,J,t),n(e,w,t),n(e,K,t),x(q,e,t),n(e,Q,t),n(e,S,t),n(e,X,t),x(k,e,t),n(e,Y,t),n(e,A,t),n(e,Z,t),x(g,e,t),n(e,ee,t),n(e,E,t),n(e,te,t),n(e,v,t),n(e,se,t),n(e,j,t),n(e,ne,t),x(I,e,t),n(e,re,t),n(e,z,t),n(e,oe,t),x(D,e,t),n(e,ue,t),n(e,R,t),ae=!0},p(e,[t]){const Le={};t&2&&(Le.$$scope={dirty:t,ctx:e}),f.$set(Le);const Me={};t&2&&(Me.$$scope={dirty:t,ctx:e}),q.$set(Me);const ye={};t&2&&(ye.$$scope={dirty:t,ctx:e}),g.$set(ye)},i(e){ae||(C(_.$$.fragment,e),C(M.$$.fragment,e),C(f.$$.fragment,e),C(q.$$.fragment,e),C(k.$$.fragment,e),C(g.$$.fragment,e),C(I.$$.fragment,e),C(D.$$.fragment,e),ae=!0)},o(e){T(_.$$.fragment,e),T(M.$$.fragment,e),T(f.$$.fragment,e),T(q.$$.fragment,e),T(k.$$.fragment,e),T(g.$$.fragment,e),T(I.$$.fragment,e),T(D.$$.fragment,e),ae=!1},d(e){e&&(s(o),s(c),s(W),s(O),s(L),s(U),s(G),s(y),s(V),s(p),s(N),s(H),s(B),s(F),s(P),s(J),s(w),s(K),s(Q),s(S),s(X),s(Y),s(A),s(Z),s(ee),s(E),s(te),s(v),s(se),s(j),s(ne),s(re),s(z),s(oe),s(ue),s(R)),s(r),b(_,e),b(M,e),b(f,e),b(q,e),b(k,e),b(g,e),b(I,e),b(D,e)}}}const We='{"title":"Architectures Seq2Seq","local":"architectures-seq2seq","sections":[{"title":"Reconnaissance automatique de la parole","local":"reconnaissance-automatique-de-la-parole","sections":[],"depth":2},{"title":"Synthèse vocale","local":"synthèse-vocale","sections":[],"depth":2},{"title":"Conclusion","local":"conclusion","sections":[],"depth":2}],"depth":1}';function Oe(m){return we(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class Be extends Se{constructor(r){super(),ke(this,r,Oe,Re,Pe,{})}}export{Be as component};
