import{S as Bt,i as Jt,s as Kt,e as n,k as v,w as qe,t as a,M as Qt,c as o,d as s,m as q,a as i,x as ge,h as r,b as d,N as Xt,G as e,g as p,y as _e,q as Ee,o as be,B as Ce,v as Yt}from"../../chunks/vendor-hf-doc-builder.js";import{T as Zt}from"../../chunks/Tip-hf-doc-builder.js";import{I as ht}from"../../chunks/IconCopyLink-hf-doc-builder.js";function es(ne){let f;return{c(){f=a("\u{1F4A1} M\xEAme si ici nous pr\xE9tendons que les spectrogrammes sont comme les images, il existe des diff\xE9rences importantes. Par exemple, d\xE9placer le contenu d'une image vers le haut ou vers le bas ne change g\xE9n\xE9ralement pas la signification de ce qui se trouve dans l'image. Cependant, d\xE9placer un spectrogramme vers le haut ou vers le bas changera les fr\xE9quences qui sont dans le son et changera compl\xE8tement son caract\xE8re. Les images sont invariantes sous translation mais les spectrogrammes ne le sont pas. Traiter les spectrogrammes comme des images peut tr\xE8s bien fonctionner dans la pratique, mais gardez \xE0 l'esprit que ce n'est pas vraiment la m\xEAme chose.")},l(_){f=r(_,"\u{1F4A1} M\xEAme si ici nous pr\xE9tendons que les spectrogrammes sont comme les images, il existe des diff\xE9rences importantes. Par exemple, d\xE9placer le contenu d'une image vers le haut ou vers le bas ne change g\xE9n\xE9ralement pas la signification de ce qui se trouve dans l'image. Cependant, d\xE9placer un spectrogramme vers le haut ou vers le bas changera les fr\xE9quences qui sont dans le son et changera compl\xE8tement son caract\xE8re. Les images sont invariantes sous translation mais les spectrogrammes ne le sont pas. Traiter les spectrogrammes comme des images peut tr\xE8s bien fonctionner dans la pratique, mais gardez \xE0 l'esprit que ce n'est pas vraiment la m\xEAme chose.")},m(_,g){p(_,f,g)},d(_){_&&s(f)}}}function ts(ne){let f,_,g,C,D,A,$e,F,xe,oe,M,Te,ie,E,$,W,y,Ae,j,ye,le,m,we,z,Se,Ne,I,Pe,Le,O,Me,Ve,R,ke,De,G,Fe,We,U,je,ze,ue,w,V,vt,ce,S,Ie,N,H,Oe,de,x,me,b,T,B,P,Re,J,Ge,pe,l,Ue,k,He,Be,K,Je,Ke,Q,Qe,Xe,X,Ye,Ze,Y,et,tt,Z,st,at,ee,rt,nt,te,ot,it,se,lt,ut,ae,ct,dt,re,mt,pt,fe;return A=new ht({}),y=new ht({}),x=new Zt({props:{$$slots:{default:[es]},$$scope:{ctx:ne}}}),P=new ht({}),{c(){f=n("meta"),_=v(),g=n("h1"),C=n("a"),D=n("span"),qe(A.$$.fragment),$e=v(),F=n("span"),xe=a("Architectures de classification d\u2019audio"),oe=v(),M=n("p"),Te=a("L\u2019objectif de la classification d\u2019audio est de pr\xE9dire une \xE9tiquette de classe pour une entr\xE9e audio. Le mod\xE8le peut pr\xE9dire une \xE9tiquette de classe unique qui couvre toute la s\xE9quence d\u2019entr\xE9e, ou il peut pr\xE9dire une \xE9tiquette pour chaque trame audio (g\xE9n\xE9ralement toutes les 20 millisecondes d\u2019entr\xE9e audio), auquel cas la sortie du mod\xE8le est une s\xE9quence de probabilit\xE9s d\u2019\xE9tiquette de classe. Un exemple du premier cas est la d\xE9tection des chants des oiseaux. Un exemple du second est la s\xE9paration des locuteurs o\xF9 le mod\xE8le pr\xE9dit quel locuteur parle \xE0 un moment donn\xE9."),ie=v(),E=n("h2"),$=n("a"),W=n("span"),qe(y.$$.fragment),Ae=v(),j=n("span"),ye=a("Classification \xE0 l'aide de spectrogrammes"),le=v(),m=n("p"),we=a(`L\u2019un des moyens les plus simples d\u2019effectuer une classification audio est de pr\xE9tendre qu\u2019il s\u2019agit d\u2019un probl\xE8me de classification d\u2019image !
Rappelons qu\u2019un spectrogramme est un tenseur bidimensionnel de forme `),z=n("code"),Se=a("(frequencies, sequence length)"),Ne=a(". Dans le [chapitre sur les donn\xE9es audio](.. /chapter1/audio_data) nous avons trac\xE9 ces spectrogrammes sous forme d\u2019images. Devinez quoi ? Nous pouvons litt\xE9ralement traiter le spectrogramme comme une image et le transmettre \xE0 un mod\xE8le de classification de type ConvNet standard tel qu\u2019un ResNet ou ConvNext et obtenir de tr\xE8s bonnes pr\xE9dictions. M\xEAme chose avec un mod\xE8le de type "),I=n("em"),Pe=a("transformer"),Le=a(` tel que le ViT.
C\u2019est ce que fait `),O=n("strong"),Me=a("Audio Spectrogram Transformer"),Ve=a(". Il utilise le ViT et lui transmet des spectrogrammes en entr\xE9e au lieu d\u2019images. Gr\xE2ce aux couches d\u2019auto-attention du "),R=n("em"),ke=a("transformer"),De=a(`, le mod\xE8le est mieux en mesure de capturer le contexte global qu\u2019un ConvNet.
Tout comme le ViT, le mod\xE8le AST divise le spectrogramme audio en une s\xE9quence de patchs d\u2019image partiellement chevauchants de 16\xD716 pixels. Cette s\xE9quence de patchs est ensuite projet\xE9e dans une s\xE9quence d\u2019ench\xE2ssement, et ceux-ci sont donn\xE9s \xE0 l\u2019encodeur du `),G=n("em"),Fe=a("transformer"),We=a(" en entr\xE9e comme d\u2019habitude. L\u2019AST est un mod\xE8le de "),U=n("em"),je=a("transformer"),ze=a(" encodeur et la sortie est donc une s\xE9quence d\u2019\xE9tats cach\xE9s, un pour chaque patch d\u2019entr\xE9e 16\xD716. En plus de cela, il y a une couche de classification simple avec activation sigmo\xEFde pour associer les \xE9tats cach\xE9s aux probabilit\xE9s de classification."),ue=v(),w=n("div"),V=n("img"),ce=v(),S=n("p"),Ie=a("Image tir\xE9e du papier "),N=n("a"),H=n("em"),Oe=a("AST: Audio Spectrogram Transformer"),de=v(),qe(x.$$.fragment),me=v(),b=n("h2"),T=n("a"),B=n("span"),qe(P.$$.fragment),Re=v(),J=n("span"),Ge=a("Tout transformer peut \xEAtre un classifieur"),pe=v(),l=n("p"),Ue=a("Dans une "),k=n("a"),He=a("section pr\xE9c\xE9dente"),Be=a(", vous avez vu que CTC est une technique efficace pour effectuer une reconnaissance automatique de la parole \xE0 l\u2019aide d\u2019un "),K=n("em"),Je=a("transformer"),Ke=a(" encodeur.  De tels mod\xE8les sont d\xE9j\xE0 des classifieurs, pr\xE9disant les probabilit\xE9s pour les \xE9tiquettes de classe \xE0 partir d\u2019un vocabulaire de "),Q=n("em"),Qe=a("tokenizer"),Xe=a(`. Nous pouvons prendre un mod\xE8le avec CTC et le transformer en un classifieur d\u2019audio \xE0 usage g\xE9n\xE9ral en changeant les \xE9tiquettes et en l\u2019entra\xEEnant avec une fonction de perte d\u2019entropie crois\xE9e standard au lieu de la perte CTC sp\xE9ciale.
Par exemple, \u{1F917} `),X=n("em"),Ye=a("Transformers"),Ze=a(" a un mod\xE8le "),Y=n("code"),et=a("Wav2Vec2ForCTC"),tt=a(" mais aussi "),Z=n("code"),st=a("Wav2Vec2ForSequenceClassification"),at=a(" et "),ee=n("code"),rt=a("Wav2Vec2ForAudioFrameClassification"),nt=a(`. Les seules diff\xE9rences entre les architectures de ces mod\xE8les sont la taille de la couche de classification et la fonction de perte utilis\xE9e.
En fait, n\u2019importe quel `),te=n("em"),ot=a("transformer"),it=a(" encodeur audio peut \xEAtre transform\xE9 en classifieur d\u2019audio en ajoutant une couche de classification au-dessus de la s\xE9quence d\u2019\xE9tats cach\xE9s. Les classifieurs n\u2019ont g\xE9n\xE9ralement pas besoin du d\xE9codeur du "),se=n("em"),lt=a("transformer"),ut=a(`.
Pour pr\xE9dire un score de classification unique pour l\u2019ensemble de la s\xE9quence (`),ae=n("code"),ct=a("Wav2Vec2ForSequenceClassification"),dt=a(`), le mod\xE8le prend la moyenne sur les \xE9tats masqu\xE9s et l\u2019introduit dans la couche de classification. Le r\xE9sultat est une distribution de probabilit\xE9 unique.
Pour cr\xE9er une classification distincte pour chaque trame audio (`),re=n("code"),mt=a("Wav2Vec2ForAudioFrameClassification"),pt=a("), le classifieur est ex\xE9cut\xE9 sur la s\xE9quence d\u2019\xE9tats masqu\xE9s, et donc la sortie du classifieur est \xE9galement une s\xE9quence."),this.h()},l(t){const u=Qt('[data-svelte="svelte-1phssyn"]',document.head);f=o(u,"META",{name:!0,content:!0}),u.forEach(s),_=q(t),g=o(t,"H1",{class:!0});var L=i(g);C=o(L,"A",{id:!0,class:!0,href:!0});var qt=i(C);D=o(qt,"SPAN",{});var gt=i(D);ge(A.$$.fragment,gt),gt.forEach(s),qt.forEach(s),$e=q(L),F=o(L,"SPAN",{});var _t=i(F);xe=r(_t,"Architectures de classification d\u2019audio"),_t.forEach(s),L.forEach(s),oe=q(t),M=o(t,"P",{});var Et=i(M);Te=r(Et,"L\u2019objectif de la classification d\u2019audio est de pr\xE9dire une \xE9tiquette de classe pour une entr\xE9e audio. Le mod\xE8le peut pr\xE9dire une \xE9tiquette de classe unique qui couvre toute la s\xE9quence d\u2019entr\xE9e, ou il peut pr\xE9dire une \xE9tiquette pour chaque trame audio (g\xE9n\xE9ralement toutes les 20 millisecondes d\u2019entr\xE9e audio), auquel cas la sortie du mod\xE8le est une s\xE9quence de probabilit\xE9s d\u2019\xE9tiquette de classe. Un exemple du premier cas est la d\xE9tection des chants des oiseaux. Un exemple du second est la s\xE9paration des locuteurs o\xF9 le mod\xE8le pr\xE9dit quel locuteur parle \xE0 un moment donn\xE9."),Et.forEach(s),ie=q(t),E=o(t,"H2",{class:!0});var he=i(E);$=o(he,"A",{id:!0,class:!0,href:!0});var bt=i($);W=o(bt,"SPAN",{});var Ct=i(W);ge(y.$$.fragment,Ct),Ct.forEach(s),bt.forEach(s),Ae=q(he),j=o(he,"SPAN",{});var $t=i(j);ye=r($t,"Classification \xE0 l'aide de spectrogrammes"),$t.forEach(s),he.forEach(s),le=q(t),m=o(t,"P",{});var h=i(m);we=r(h,`L\u2019un des moyens les plus simples d\u2019effectuer une classification audio est de pr\xE9tendre qu\u2019il s\u2019agit d\u2019un probl\xE8me de classification d\u2019image !
Rappelons qu\u2019un spectrogramme est un tenseur bidimensionnel de forme `),z=o(h,"CODE",{});var xt=i(z);Se=r(xt,"(frequencies, sequence length)"),xt.forEach(s),Ne=r(h,". Dans le [chapitre sur les donn\xE9es audio](.. /chapter1/audio_data) nous avons trac\xE9 ces spectrogrammes sous forme d\u2019images. Devinez quoi ? Nous pouvons litt\xE9ralement traiter le spectrogramme comme une image et le transmettre \xE0 un mod\xE8le de classification de type ConvNet standard tel qu\u2019un ResNet ou ConvNext et obtenir de tr\xE8s bonnes pr\xE9dictions. M\xEAme chose avec un mod\xE8le de type "),I=o(h,"EM",{});var Tt=i(I);Pe=r(Tt,"transformer"),Tt.forEach(s),Le=r(h,` tel que le ViT.
C\u2019est ce que fait `),O=o(h,"STRONG",{});var At=i(O);Me=r(At,"Audio Spectrogram Transformer"),At.forEach(s),Ve=r(h,". Il utilise le ViT et lui transmet des spectrogrammes en entr\xE9e au lieu d\u2019images. Gr\xE2ce aux couches d\u2019auto-attention du "),R=o(h,"EM",{});var yt=i(R);ke=r(yt,"transformer"),yt.forEach(s),De=r(h,`, le mod\xE8le est mieux en mesure de capturer le contexte global qu\u2019un ConvNet.
Tout comme le ViT, le mod\xE8le AST divise le spectrogramme audio en une s\xE9quence de patchs d\u2019image partiellement chevauchants de 16\xD716 pixels. Cette s\xE9quence de patchs est ensuite projet\xE9e dans une s\xE9quence d\u2019ench\xE2ssement, et ceux-ci sont donn\xE9s \xE0 l\u2019encodeur du `),G=o(h,"EM",{});var wt=i(G);Fe=r(wt,"transformer"),wt.forEach(s),We=r(h," en entr\xE9e comme d\u2019habitude. L\u2019AST est un mod\xE8le de "),U=o(h,"EM",{});var St=i(U);je=r(St,"transformer"),St.forEach(s),ze=r(h," encodeur et la sortie est donc une s\xE9quence d\u2019\xE9tats cach\xE9s, un pour chaque patch d\u2019entr\xE9e 16\xD716. En plus de cela, il y a une couche de classification simple avec activation sigmo\xEFde pour associer les \xE9tats cach\xE9s aux probabilit\xE9s de classification."),h.forEach(s),ue=q(t),w=o(t,"DIV",{class:!0});var Nt=i(w);V=o(Nt,"IMG",{src:!0,alt:!0}),Nt.forEach(s),ce=q(t),S=o(t,"P",{});var ft=i(S);Ie=r(ft,"Image tir\xE9e du papier "),N=o(ft,"A",{href:!0,rel:!0});var Pt=i(N);H=o(Pt,"EM",{});var Lt=i(H);Oe=r(Lt,"AST: Audio Spectrogram Transformer"),Lt.forEach(s),Pt.forEach(s),ft.forEach(s),de=q(t),ge(x.$$.fragment,t),me=q(t),b=o(t,"H2",{class:!0});var ve=i(b);T=o(ve,"A",{id:!0,class:!0,href:!0});var Mt=i(T);B=o(Mt,"SPAN",{});var Vt=i(B);ge(P.$$.fragment,Vt),Vt.forEach(s),Mt.forEach(s),Re=q(ve),J=o(ve,"SPAN",{});var kt=i(J);Ge=r(kt,"Tout transformer peut \xEAtre un classifieur"),kt.forEach(s),ve.forEach(s),pe=q(t),l=o(t,"P",{});var c=i(l);Ue=r(c,"Dans une "),k=o(c,"A",{href:!0});var Dt=i(k);He=r(Dt,"section pr\xE9c\xE9dente"),Dt.forEach(s),Be=r(c,", vous avez vu que CTC est une technique efficace pour effectuer une reconnaissance automatique de la parole \xE0 l\u2019aide d\u2019un "),K=o(c,"EM",{});var Ft=i(K);Je=r(Ft,"transformer"),Ft.forEach(s),Ke=r(c," encodeur.  De tels mod\xE8les sont d\xE9j\xE0 des classifieurs, pr\xE9disant les probabilit\xE9s pour les \xE9tiquettes de classe \xE0 partir d\u2019un vocabulaire de "),Q=o(c,"EM",{});var Wt=i(Q);Qe=r(Wt,"tokenizer"),Wt.forEach(s),Xe=r(c,`. Nous pouvons prendre un mod\xE8le avec CTC et le transformer en un classifieur d\u2019audio \xE0 usage g\xE9n\xE9ral en changeant les \xE9tiquettes et en l\u2019entra\xEEnant avec une fonction de perte d\u2019entropie crois\xE9e standard au lieu de la perte CTC sp\xE9ciale.
Par exemple, \u{1F917} `),X=o(c,"EM",{});var jt=i(X);Ye=r(jt,"Transformers"),jt.forEach(s),Ze=r(c," a un mod\xE8le "),Y=o(c,"CODE",{});var zt=i(Y);et=r(zt,"Wav2Vec2ForCTC"),zt.forEach(s),tt=r(c," mais aussi "),Z=o(c,"CODE",{});var It=i(Z);st=r(It,"Wav2Vec2ForSequenceClassification"),It.forEach(s),at=r(c," et "),ee=o(c,"CODE",{});var Ot=i(ee);rt=r(Ot,"Wav2Vec2ForAudioFrameClassification"),Ot.forEach(s),nt=r(c,`. Les seules diff\xE9rences entre les architectures de ces mod\xE8les sont la taille de la couche de classification et la fonction de perte utilis\xE9e.
En fait, n\u2019importe quel `),te=o(c,"EM",{});var Rt=i(te);ot=r(Rt,"transformer"),Rt.forEach(s),it=r(c," encodeur audio peut \xEAtre transform\xE9 en classifieur d\u2019audio en ajoutant une couche de classification au-dessus de la s\xE9quence d\u2019\xE9tats cach\xE9s. Les classifieurs n\u2019ont g\xE9n\xE9ralement pas besoin du d\xE9codeur du "),se=o(c,"EM",{});var Gt=i(se);lt=r(Gt,"transformer"),Gt.forEach(s),ut=r(c,`.
Pour pr\xE9dire un score de classification unique pour l\u2019ensemble de la s\xE9quence (`),ae=o(c,"CODE",{});var Ut=i(ae);ct=r(Ut,"Wav2Vec2ForSequenceClassification"),Ut.forEach(s),dt=r(c,`), le mod\xE8le prend la moyenne sur les \xE9tats masqu\xE9s et l\u2019introduit dans la couche de classification. Le r\xE9sultat est une distribution de probabilit\xE9 unique.
Pour cr\xE9er une classification distincte pour chaque trame audio (`),re=o(c,"CODE",{});var Ht=i(re);mt=r(Ht,"Wav2Vec2ForAudioFrameClassification"),Ht.forEach(s),pt=r(c,"), le classifieur est ex\xE9cut\xE9 sur la s\xE9quence d\u2019\xE9tats masqu\xE9s, et donc la sortie du classifieur est \xE9galement une s\xE9quence."),c.forEach(s),this.h()},h(){d(f,"name","hf:doc:metadata"),d(f,"content",JSON.stringify(ss)),d(C,"id","architectures-de-classification-daudio"),d(C,"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(C,"href","#architectures-de-classification-daudio"),d(g,"class","relative group"),d($,"id","classification-laide-de-spectrogrammes"),d($,"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($,"href","#classification-laide-de-spectrogrammes"),d(E,"class","relative group"),Xt(V.src,vt="https://huggingface.co/datasets/huggingface-course/audio-course-images/resolve/main/ast.png")||d(V,"src",vt),d(V,"alt","The audio spectrogram transformer works on a sequence of patches taken from the spectrogram"),d(w,"class","flex justify-center"),d(N,"href","https://arxiv.org/pdf/2104.01778.pdf"),d(N,"rel","nofollow"),d(T,"id","tout-transformer-peut-tre-un-classifieur"),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","#tout-transformer-peut-tre-un-classifieur"),d(b,"class","relative group"),d(k,"href","CTC")},m(t,u){e(document.head,f),p(t,_,u),p(t,g,u),e(g,C),e(C,D),_e(A,D,null),e(g,$e),e(g,F),e(F,xe),p(t,oe,u),p(t,M,u),e(M,Te),p(t,ie,u),p(t,E,u),e(E,$),e($,W),_e(y,W,null),e(E,Ae),e(E,j),e(j,ye),p(t,le,u),p(t,m,u),e(m,we),e(m,z),e(z,Se),e(m,Ne),e(m,I),e(I,Pe),e(m,Le),e(m,O),e(O,Me),e(m,Ve),e(m,R),e(R,ke),e(m,De),e(m,G),e(G,Fe),e(m,We),e(m,U),e(U,je),e(m,ze),p(t,ue,u),p(t,w,u),e(w,V),p(t,ce,u),p(t,S,u),e(S,Ie),e(S,N),e(N,H),e(H,Oe),p(t,de,u),_e(x,t,u),p(t,me,u),p(t,b,u),e(b,T),e(T,B),_e(P,B,null),e(b,Re),e(b,J),e(J,Ge),p(t,pe,u),p(t,l,u),e(l,Ue),e(l,k),e(k,He),e(l,Be),e(l,K),e(K,Je),e(l,Ke),e(l,Q),e(Q,Qe),e(l,Xe),e(l,X),e(X,Ye),e(l,Ze),e(l,Y),e(Y,et),e(l,tt),e(l,Z),e(Z,st),e(l,at),e(l,ee),e(ee,rt),e(l,nt),e(l,te),e(te,ot),e(l,it),e(l,se),e(se,lt),e(l,ut),e(l,ae),e(ae,ct),e(l,dt),e(l,re),e(re,mt),e(l,pt),fe=!0},p(t,[u]){const L={};u&2&&(L.$$scope={dirty:u,ctx:t}),x.$set(L)},i(t){fe||(Ee(A.$$.fragment,t),Ee(y.$$.fragment,t),Ee(x.$$.fragment,t),Ee(P.$$.fragment,t),fe=!0)},o(t){be(A.$$.fragment,t),be(y.$$.fragment,t),be(x.$$.fragment,t),be(P.$$.fragment,t),fe=!1},d(t){s(f),t&&s(_),t&&s(g),Ce(A),t&&s(oe),t&&s(M),t&&s(ie),t&&s(E),Ce(y),t&&s(le),t&&s(m),t&&s(ue),t&&s(w),t&&s(ce),t&&s(S),t&&s(de),Ce(x,t),t&&s(me),t&&s(b),Ce(P),t&&s(pe),t&&s(l)}}}const ss={local:"architectures-de-classification-daudio",sections:[{local:"classification-laide-de-spectrogrammes",title:"Classification \xE0 l'aide de spectrogrammes"},{local:"tout-transformer-peut-tre-un-classifieur",title:"Tout transformer peut \xEAtre un classifieur"}],title:"Architectures de classification d\u2019audio"};function as(ne){return Yt(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class is extends Bt{constructor(f){super();Jt(this,f,as,ts,Kt,{})}}export{is as default,ss as metadata};
