Buckets:
| <meta charset="utf-8" /><meta name="hf:doc:metadata" content="{"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}"> | |
| <link href="/docs/audio-course/pr_239/fr/_app/immutable/assets/0.e3b0c442.css" rel="modulepreload"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/fr/_app/immutable/entry/start.48d22ca3.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/fr/_app/immutable/chunks/scheduler.a045fce0.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/fr/_app/immutable/chunks/singletons.932e46dd.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/fr/_app/immutable/chunks/index.2447c7d9.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/fr/_app/immutable/chunks/paths.50fd3c21.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/fr/_app/immutable/entry/app.4e1ef9b0.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/fr/_app/immutable/chunks/preload-helper.aa8f5fd5.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/fr/_app/immutable/chunks/index.5135b896.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/fr/_app/immutable/nodes/0.00a7cda2.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/fr/_app/immutable/chunks/each.e59479a4.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/fr/_app/immutable/nodes/19.650983a4.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/fr/_app/immutable/chunks/Tip.872c1b89.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/fr/_app/immutable/chunks/MermaidChart.svelte_svelte_type_style_lang.59591d32.js"><!-- HEAD_svelte-u9bgzb_START --><meta name="hf:doc:metadata" content="{"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}"><!-- 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="architectures-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="#architectures-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>Architectures Seq2Seq</span></h1> <p data-svelte-h="svelte-1uizh2k">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.</p> <h2 class="relative group"><a id="reconnaissance-automatique-de-la-parole" 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="#reconnaissance-automatique-de-la-parole"><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>Reconnaissance automatique de la parole</span></h2> <p data-svelte-h="svelte-13glvq2">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>) :</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-1w933iz">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.</p> <blockquote class="tip">💡 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.</blockquote> <p data-svelte-h="svelte-alze8h">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:</p> <ol data-svelte-h="svelte-1mj5i09"><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></ol> <blockquote class="tip">💡 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.</blockquote> <p data-svelte-h="svelte-mjeihy">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.</p> <h2 class="relative group"><a id="synthèse-vocale" 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="#synthèse-vocale"><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>Synthèse vocale</span></h2> <p data-svelte-h="svelte-sgypc3">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.</p> <blockquote class="tip">💡 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.</blockquote> <p data-svelte-h="svelte-12ao7xs">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.</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-1v9h4f2">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.</p> <h2 class="relative group"><a id="conclusion" 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="#conclusion"><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>Conclusion</span></h2> <p data-svelte-h="svelte-1stqyyn">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.</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/fr/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_oc6cu6 = { | |
| assets: "/docs/audio-course/pr_239/fr", | |
| base: "/docs/audio-course/pr_239/fr", | |
| env: {} | |
| }; | |
| const element = document.currentScript.parentElement; | |
| const data = [null,null]; | |
| Promise.all([ | |
| import("/docs/audio-course/pr_239/fr/_app/immutable/entry/start.48d22ca3.js"), | |
| import("/docs/audio-course/pr_239/fr/_app/immutable/entry/app.4e1ef9b0.js") | |
| ]).then(([kit, app]) => { | |
| kit.start(app, element, { | |
| node_ids: [0, 19], | |
| data, | |
| form: null, | |
| error: null | |
| }); | |
| }); | |
| } | |
| </script> | |
Xet Storage Details
- Size:
- 21.1 kB
- Xet hash:
- 3ab498d5ba4eea49c2c0d871b836382eff24767cd75074305fc421d745ecd90e
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.