import{s as ml,f as Tl,o as Ml,n as hl}from"../chunks/scheduler.f7e1785c.js";import{S as yl,i as fl,g as p,s as a,r as c,A as wl,h as i,f as l,c as n,j as vt,u as r,x as o,k as $,y as Jl,a as s,v as u,d as m,t as T,w as M,m as dl,n as Ul}from"../chunks/index.9f8f0838.js";import{T as ul}from"../chunks/Tip.4575d9cf.js";import{C as y}from"../chunks/CodeBlock.b3510e34.js";import{H as ge}from"../chunks/Heading.6643a2f7.js";function jl(be){let h,w=`Whisper также можно “обманом” заставить перевести речь на любом языке X на любой язык Y. Просто задайте задачу <code>&quot;transcribe&quot;</code>, а <code>&quot;language&quot;</code> - целевым языком
в аргументах ключевых слов генерации, например, для испанского языка можно задать:`,d,U,b="<code>generate_kwargs={&quot;task&quot;: &quot;transcribe&quot;, &quot;language&quot;: &quot;es&quot;}</code>";return{c(){h=p("p"),h.innerHTML=w,d=a(),U=p("p"),U.innerHTML=b},l(f){h=i(f,"P",{"data-svelte-h":!0}),o(h)!=="svelte-1292pox"&&(h.innerHTML=w),d=n(f),U=i(f,"P",{"data-svelte-h":!0}),o(U)!=="svelte-1dcxmlc"&&(U.innerHTML=b)},m(f,j){s(f,h,j),s(f,d,j),s(f,U,j)},p:hl,d(f){f&&(l(h),l(d),l(U))}}}function $l(be){let h;return{c(){h=dl(`Здесь мы используем контрольную точку SpeechT5, обученную специально для английского TTS. Если вы хотите перевести
    на язык, отличный от английского, либо замените контрольную точку на модель SpeechT5 TTS, дообученную для выбранного
    вами языка, либо используйте контрольную точку MMS TTS, предварительно обученную для вашего целевого языка.`)},l(w){h=Ul(w,`Здесь мы используем контрольную точку SpeechT5, обученную специально для английского TTS. Если вы хотите перевести
    на язык, отличный от английского, либо замените контрольную точку на модель SpeechT5 TTS, дообученную для выбранного
    вами языка, либо используйте контрольную точку MMS TTS, предварительно обученную для вашего целевого языка.`)},m(w,d){s(w,h,d)},d(w){w&&l(h)}}}function bl(be){let h,w,d,U,b,f,j,St=`Перевод речи в речь (Speech-to-speech, STST или S2ST) - это относительно новая задача обработки устной речи. Она заключается
в переводе [NL] речи с одного языка в речь на <strong>другом</strong> языке:`,Ge,Z,It='<img src="https://huggingface.co/datasets/huggingface-course/audio-course-images/resolve/main/s2st.png" alt="Diagram of speech to speech translation"/>',Ce,v,Wt=`STST можно рассматривать как расширение традиционной задачи машинного перевода (МТ): вместо перевода <strong>текста</strong> с одного языка
на другой мы переводим <strong>речь</strong> с одного языка на другой. STST находит применение в области многоязыковой коммуникации,
позволяя носителям разных языков общаться друг с другом посредством речи.`,ve,S,xt=`Предположим, вы хотите общаться с другим человеком, преодолевая языковой барьер. Вместо того чтобы писать информацию, которую вы хотите
передать, а затем переводить ее в текст на целевом языке, вы можете говорить напрямую, а система STST преобразует вашу устную речь
в целевой язык. Получатель может ответить, обратившись к системе STST, а вы можете прослушать его ответ. Это более естественный
способ общения по сравнению с машинным переводом текста.`,Se,I,Nt=`В этом разделе мы рассмотрим <em>каскадный</em> подход к STST, объединив знания, полученные в разделах 5 и 6 курса. Мы будем использовать
систему <em>перевода речи (ST)</em> для транскрибирования исходной речи в текст на целевом языке, а затем <em>перевода текста в речь (TTS)</em>
для генерации речи на целевом языке из переведенного текста:`,Ie,g,_t='<img src="https://huggingface.co/datasets/huggingface-course/audio-course-images/resolve/main/s2st_cascaded.png" alt="Diagram of cascaded speech to speech translation"/>',We,W,kt=`Можно было бы использовать и трехэтапный подход, когда сначала с помощью системы автоматического распознавания речи (ASR) исходная речь транскрибируется в текст на том же
языке, затем с помощью машинного перевода транскрибированный текст переводится на целевой язык, и, наконец, с помощью преобразования текста в речь формируется речь
на целевом языке. Однако добавление большего числа компонентов в конвейер приводит к <em>распространению ошибок</em>, когда ошибки, вносимые в одну систему, усугубляются
при прохождении через остальные системы, а также к увеличению задержки, поскольку инференс приходится проводить для большего числа моделей.`,xe,x,Bt=`Несмотря на то, что такой каскадный подход к STST достаточно прост, он позволяет создавать очень эффективные системы STST. Трехступенчатая каскадная система ASR + MT + TTS
ранее использовалась для работы многих коммерческих продуктов STST, в том числе <a href="https://ai.googleblog.com/2019/05/introducing-translatotron-end-to-end.html" rel="nofollow">Google Translate</a>.`,Ne,N,Vt=`Это также очень эффективный способ разработки STST-системы, поскольку существующие системы распознавания речи и преобразования текста в речь могут быть объединены
для получения новой STST-модели без дополнительного обучения.`,_e,_,Xt=`В оставшейся части этого раздела мы сосредоточимся на создании системы STST, которая переводит речь с любого языка X в речь на английском языке.
Рассмотренные методы могут быть распространены на системы STST, переводящие с любого языка X на любой язык Y, но мы оставляем это на усмотрение читателя и
указываем, где это возможно.Далее мы разделяем задачу STST на две составные части: ST и TTS. В завершение мы соединим их вместе и создадин демо с помощью Gradio
для демонстрации нашей системы.`,ke,k,Be,B,Ht=`Мы будем использовать модель Whisper для нашей системы перевода речи, поскольку эта модель способна переводить с более чем 96 языков на английский.
В частности, мы загрузим контрольную точку <a href="https://huggingface.co/openai/whisper-base" rel="nofollow">Whisper Base</a>, которая имеет 74М параметров. Это далеко не самая производительная
модель Whisper, поскольку <a href="https://huggingface.co/openai/whisper-large-v2" rel="nofollow">наибольшая контрольная точка Whisper</a> более чем в 20 раз больше, но поскольку мы объединяем две
авторегрессивные системы (ST + TTS), мы хотим, чтобы каждая модель могла работать относительно быстро, чтобы мы получили приемлемую скорость инференса:`,Ve,V,Xe,X,qt=`Отлично! Для проверки нашей системы STST загрузим аудиопример на неанглийском языке. Загрузим первый пример из итальянской (<code>it</code>) части
датасета <a href="https://huggingface.co/datasets/facebook/voxpopuli" rel="nofollow">VoxPopuli</a>:`,He,H,qe,q,Yt='Чтобы прослушать этот пример, мы можем либо воспроизвести его с помощью средства просмотра набора данных на Hub: <a href="https://huggingface.co/datasets/facebook/voxpopuli/viewer/it/validation?row=0" rel="nofollow">facebook/voxpopuli/viewer</a>',Ye,Y,Rt="Или воспроизведение с помощью функции ipynb audio:",Re,R,Qe,Q,Qt=`Теперь определим функцию, которая принимает этот аудиовход и возвращает переведенный текст. Вы помните, что мы должны передать ключевое слово генерации аргументу <code>&quot;task&quot;</code>,
установив его в значение <code>&quot;translate&quot;</code>, чтобы убедиться, что Whisper выполняет перевод речи, а не ее распознавание:`,Fe,F,ze,G,Ee,z,Ft="Отлично! Давайте быстро проверим, что мы получаем разумный результат от модели:",Le,E,Pe,L,Ae,P,zt="Хорошо! Если мы сравним это с исходным текстом:",Ke,A,De,K,Oe,D,Et=`Мы увидим, что перевод более или менее совпадает (вы можете проверить это с помощью Google Translate), за исключением нескольких
лишних слов в начале транскрипции, когда говорящий заканчивал предыдущее предложение.`,et,O,Lt=`На этом мы завершили первую половину нашего каскадного конвейера STST, применив на практике навыки, полученные в разделе 5, когда мы учились использовать
модель Whisper для распознавания и перевода речи. Если вы хотите освежить в памяти какие-либо из рассмотренных нами этапов, прочтите
раздел <a href="../chapter5/asr_models">Предварительно обученные модели для распознавания речи</a> из раздела 5.`,tt,ee,lt,te,Pt=`Вторая половина нашей каскадной системы STST связана с преобразованием английского текста в английскую речь. Для этого мы
будем использовать предварительно обученную модель <a href="https://huggingface.co/microsoft/speecht5_tts" rel="nofollow">SpeechT5 TTS</a> для английского TTS.
🤗 В настоящее время Transformers не имеет TTS <code>pipeline</code>, поэтому нам придется использовать модель непосредственно самим.
Ничего страшного, вы же все эксперты по использованию модели для инференса после раздела 6!`,st,le,At="Сначала загрузим процессор SpeechT5, модель и вокодер из предварительно обученной контрольной точки:",at,se,nt,C,pt,ae,Kt="Как и в случае с моделью Whisper, модель SpeechT5 и вокодер мы поместим на GPU-ускоритель, если он у нас есть:",it,ne,ot,pe,Dt="Отлично! Давайте загрузим эмбеддинги дикторов:",ct,ie,rt,oe,Ot=`Теперь мы можем написать функцию, которая принимает на вход текстовый запрос и генерирует соответствующую речь. Сначала мы предварительно обработаем
текстовый ввод с помощью процессора SpeechT5, токенизируя текст для получения входных идентификаторов. Затем мы передадим входные идентификаторы и
эбеддинги диктора в модель SpeechT5, разместив каждый из них на ускорителе, если таковой имеется. Наконец, мы вернем сгенерированную речь обратно в
процессор, чтобы мы могли воспроизвести ее в нашем ноутбуке ipynb:`,ut,ce,mt,re,el="Проверим его работу с помощью фиктивного текстового ввода:",Tt,ue,Mt,me,tl="Звучит неплохо! Теперь самое интересное - собрать все воедино.",ht,Te,yt,Me,ll=`Перед тем как создать демо <a href="https://gradio.app" rel="nofollow">Gradio</a> для демонстрации нашей системы STST, давайте сначала проведем быструю проверку, чтобы убедиться,
что мы можем объединить две модели, подавая аудио пример на вход и получая аудио пример на выходе. Для этого мы объединим две функции, определенные в
предыдущих двух подразделах: введем исходное аудио и получим переведенный текст, затем синтезируем переведенный текст, чтобы получить переведенную речь.
Наконец, мы преобразуем синтезированную речь в массив <code>int16</code>, который является форматом выходного аудиофайла, ожидаемого Gradio. Для этого сначала
необходимо нормализовать аудио массив по динамическому диапазону целевого dtype (<code>int16</code>), а затем преобразовать из стандартного dtype NumPy (<code>float64</code>)
в целевой dtype (<code>int16</code>):`,ft,he,wt,ye,sl="Проверим, что эта конкатенированная функция дает ожидаемый результат:",Jt,fe,dt,we,al=`Отлично! Теперь мы завернем это в красивое демо Gradio, чтобы мы могли записать нашу исходную речь с помощью
микрофонного или файлового входа и воспроизвести прогноз системы:`,Ut,Je,jt,de,nl="В результате будет запущена демо Gradio, аналогичная той, что работает на Hugging Face Space:",$t,J,pl,bt,Ue,il=`Вы можете <a href="https://huggingface.co/spaces/course-demos/speech-to-speech-translation?duplicate=true" rel="nofollow">дублировать</a> это демо и адаптировать его для
использования другой контрольной точки Whisper, другой контрольной точки TTS, или отказаться от ограничений по выводу английской речи
и следовать советам по переводу на выбранный вами язык!`,Zt,je,gt,$e,ol=`Хотя каскадная система представляет собой эффективный с точки зрения вычислений и данных способ построения системы STST, она страдает от описанных выше
проблем распространения ошибок и аддитивной задержки. В последних работах исследовался <em>прямой</em> подход к STST, который не прогнозирует промежуточный
текстовый вывод, а напрямую переводит исходную речь в целевую. Эти системы также способны сохранять в целевой речи речевые характеристики
диктора-источника (такие как просодия, высота тона и интонация). Если вы хотите узнать больше об этих системах, ознакомьтесь с ресурсами,
перечисленными в секции <a href="supplemental_reading">дополнительные материалы и ресурсы</a>.`,Gt,Ze,Ct;return b=new ge({props:{title:"Перевод Speech-to-speech",local:"перевод-speech-to-speech",headingTag:"h1"}}),k=new ge({props:{title:"Перевод речи",local:"перевод-речи",headingTag:"h2"}}),V=new y({props:{code:"aW1wb3J0JTIwdG9yY2glMEFmcm9tJTIwdHJhbnNmb3JtZXJzJTIwaW1wb3J0JTIwcGlwZWxpbmUlMEElMEFkZXZpY2UlMjAlM0QlMjAlMjJjdWRhJTNBMCUyMiUyMGlmJTIwdG9yY2guY3VkYS5pc19hdmFpbGFibGUoKSUyMGVsc2UlMjAlMjJjcHUlMjIlMEFwaXBlJTIwJTNEJTIwcGlwZWxpbmUoJTBBJTIwJTIwJTIwJTIwJTIyYXV0b21hdGljLXNwZWVjaC1yZWNvZ25pdGlvbiUyMiUyQyUyMG1vZGVsJTNEJTIyb3BlbmFpJTJGd2hpc3Blci1iYXNlJTIyJTJDJTIwZGV2aWNlJTNEZGV2aWNlJTBBKQ==",highlighted:`<span class="hljs-keyword">import</span> torch
<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> pipeline

device = <span class="hljs-string">&quot;cuda:0&quot;</span> <span class="hljs-keyword">if</span> torch.cuda.is_available() <span class="hljs-keyword">else</span> <span class="hljs-string">&quot;cpu&quot;</span>
pipe = pipeline(
    <span class="hljs-string">&quot;automatic-speech-recognition&quot;</span>, model=<span class="hljs-string">&quot;openai/whisper-base&quot;</span>, device=device
)`,wrap:!1}}),H=new y({props:{code:"ZnJvbSUyMGRhdGFzZXRzJTIwaW1wb3J0JTIwbG9hZF9kYXRhc2V0JTBBJTBBZGF0YXNldCUyMCUzRCUyMGxvYWRfZGF0YXNldCglMjJmYWNlYm9vayUyRnZveHBvcHVsaSUyMiUyQyUyMCUyMml0JTIyJTJDJTIwc3BsaXQlM0QlMjJ2YWxpZGF0aW9uJTIyJTJDJTIwc3RyZWFtaW5nJTNEVHJ1ZSklMEFzYW1wbGUlMjAlM0QlMjBuZXh0KGl0ZXIoZGF0YXNldCkp",highlighted:`<span class="hljs-keyword">from</span> datasets <span class="hljs-keyword">import</span> load_dataset

dataset = load_dataset(<span class="hljs-string">&quot;facebook/voxpopuli&quot;</span>, <span class="hljs-string">&quot;it&quot;</span>, split=<span class="hljs-string">&quot;validation&quot;</span>, streaming=<span class="hljs-literal">True</span>)
sample = <span class="hljs-built_in">next</span>(<span class="hljs-built_in">iter</span>(dataset))`,wrap:!1}}),R=new y({props:{code:"ZnJvbSUyMElQeXRob24uZGlzcGxheSUyMGltcG9ydCUyMEF1ZGlvJTBBJTBBQXVkaW8oc2FtcGxlJTVCJTIyYXVkaW8lMjIlNUQlNUIlMjJhcnJheSUyMiU1RCUyQyUyMHJhdGUlM0RzYW1wbGUlNUIlMjJhdWRpbyUyMiU1RCU1QiUyMnNhbXBsaW5nX3JhdGUlMjIlNUQp",highlighted:`<span class="hljs-keyword">from</span> IPython.display <span class="hljs-keyword">import</span> Audio

Audio(sample[<span class="hljs-string">&quot;audio&quot;</span>][<span class="hljs-string">&quot;array&quot;</span>], rate=sample[<span class="hljs-string">&quot;audio&quot;</span>][<span class="hljs-string">&quot;sampling_rate&quot;</span>])`,wrap:!1}}),F=new y({props:{code:"ZGVmJTIwdHJhbnNsYXRlKGF1ZGlvKSUzQSUwQSUyMCUyMCUyMCUyMG91dHB1dHMlMjAlM0QlMjBwaXBlKGF1ZGlvJTJDJTIwbWF4X25ld190b2tlbnMlM0QyNTYlMkMlMjBnZW5lcmF0ZV9rd2FyZ3MlM0QlN0IlMjJ0YXNrJTIyJTNBJTIwJTIydHJhbnNsYXRlJTIyJTdEKSUwQSUyMCUyMCUyMCUyMHJldHVybiUyMG91dHB1dHMlNUIlMjJ0ZXh0JTIyJTVE",highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">translate</span>(<span class="hljs-params">audio</span>):
    outputs = pipe(audio, max_new_tokens=<span class="hljs-number">256</span>, generate_kwargs={<span class="hljs-string">&quot;task&quot;</span>: <span class="hljs-string">&quot;translate&quot;</span>})
    <span class="hljs-keyword">return</span> outputs[<span class="hljs-string">&quot;text&quot;</span>]`,wrap:!1}}),G=new ul({props:{$$slots:{default:[jl]},$$scope:{ctx:be}}}),E=new y({props:{code:"dHJhbnNsYXRlKHNhbXBsZSU1QiUyMmF1ZGlvJTIyJTVELmNvcHkoKSk=",highlighted:'translate(sample[<span class="hljs-string">&quot;audio&quot;</span>].copy())',wrap:!1}}),L=new y({props:{code:"JyUyMHBzeWNob2xvZ2ljYWwlMjBhbmQlMjBzb2NpYWwuJTIwSSUyMHRoaW5rJTIwdGhhdCUyMGl0JTIwaXMlMjBhJTIwdmVyeSUyMGltcG9ydGFudCUyMHN0ZXAlMjBpbiUyMHRoZSUyMGNvbnN0cnVjdGlvbiUyMG9mJTIwYSUyMGp1cmlkaWNhbCUyMHNwYWNlJTIwb2YlMjBmcmVlZG9tJTJDJTIwY2lyY3VsYXRpb24lMjBhbmQlMjBwcm90ZWN0aW9uJTIwb2YlMjByaWdodHMuJw==",highlighted:'<span class="hljs-comment">&#x27; psychological and social. I think that it is a very important step in the construction of a juridical space of freedom, circulation and protection of rights.&#x27;</span>',wrap:!1}}),A=new y({props:{code:"c2FtcGxlJTVCJTIycmF3X3RleHQlMjIlNUQ=",highlighted:'sample[<span class="hljs-string">&quot;raw_text&quot;</span>]',wrap:!1}}),K=new y({props:{code:"J1BlbnNvJTIwY2hlJTIwcXVlc3RvJTIwc2lhJTIwdW4lMjBwYXNzbyUyMGluJTIwYXZhbnRpJTIwaW1wb3J0YW50ZSUyMG5lbGxhJTIwY29zdHJ1emlvbmUlMjBkaSUyMHVubyUyMHNwYXppbyUyMGdpdXJpZGljbyUyMGRpJTIwbGliZXJ0JUMzJUEwJTIwZGklMjBjaXJjb2xhemlvbmUlMjBlJTIwZGklMjBwcm90ZXppb25lJTIwZGVpJTIwZGlyaXR0aSUyMHBlciUyMGxlJTIwcGVyc29uZSUyMGluJTIwRXVyb3BhLic=",highlighted:'<span class="hljs-comment">&#x27;Penso che questo sia un passo in avanti importante nella costruzione di uno spazio giuridico di libertà di circolazione e di protezione dei diritti per le persone in Europa.&#x27;</span>',wrap:!1}}),ee=new ge({props:{title:"Преобразование текста в речь",local:"преобразование-текста-в-речь",headingTag:"h2"}}),se=new y({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMFNwZWVjaFQ1UHJvY2Vzc29yJTJDJTIwU3BlZWNoVDVGb3JUZXh0VG9TcGVlY2glMkMlMjBTcGVlY2hUNUhpZmlHYW4lMEElMEFwcm9jZXNzb3IlMjAlM0QlMjBTcGVlY2hUNVByb2Nlc3Nvci5mcm9tX3ByZXRyYWluZWQoJTIybWljcm9zb2Z0JTJGc3BlZWNodDVfdHRzJTIyKSUwQSUwQW1vZGVsJTIwJTNEJTIwU3BlZWNoVDVGb3JUZXh0VG9TcGVlY2guZnJvbV9wcmV0cmFpbmVkKCUyMm1pY3Jvc29mdCUyRnNwZWVjaHQ1X3R0cyUyMiklMEF2b2NvZGVyJTIwJTNEJTIwU3BlZWNoVDVIaWZpR2FuLmZyb21fcHJldHJhaW5lZCglMjJtaWNyb3NvZnQlMkZzcGVlY2h0NV9oaWZpZ2FuJTIyKQ==",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> SpeechT5Processor, SpeechT5ForTextToSpeech, SpeechT5HifiGan

processor = SpeechT5Processor.from_pretrained(<span class="hljs-string">&quot;microsoft/speecht5_tts&quot;</span>)

model = SpeechT5ForTextToSpeech.from_pretrained(<span class="hljs-string">&quot;microsoft/speecht5_tts&quot;</span>)
vocoder = SpeechT5HifiGan.from_pretrained(<span class="hljs-string">&quot;microsoft/speecht5_hifigan&quot;</span>)`,wrap:!1}}),C=new ul({props:{$$slots:{default:[$l]},$$scope:{ctx:be}}}),ne=new y({props:{code:"bW9kZWwudG8oZGV2aWNlKSUwQXZvY29kZXIudG8oZGV2aWNlKQ==",highlighted:`model.to(device)
vocoder.to(device)`,wrap:!1}}),ie=new y({props:{code:"ZW1iZWRkaW5nc19kYXRhc2V0JTIwJTNEJTIwbG9hZF9kYXRhc2V0KCUyMk1hdHRoaWpzJTJGY211LWFyY3RpYy14dmVjdG9ycyUyMiUyQyUyMHNwbGl0JTNEJTIydmFsaWRhdGlvbiUyMiklMEFzcGVha2VyX2VtYmVkZGluZ3MlMjAlM0QlMjB0b3JjaC50ZW5zb3IoZW1iZWRkaW5nc19kYXRhc2V0JTVCNzMwNiU1RCU1QiUyMnh2ZWN0b3IlMjIlNUQpLnVuc3F1ZWV6ZSgwKQ==",highlighted:`embeddings_dataset = load_dataset(<span class="hljs-string">&quot;Matthijs/cmu-arctic-xvectors&quot;</span>, split=<span class="hljs-string">&quot;validation&quot;</span>)
speaker_embeddings = torch.tensor(embeddings_dataset[<span class="hljs-number">7306</span>][<span class="hljs-string">&quot;xvector&quot;</span>]).unsqueeze(<span class="hljs-number">0</span>)`,wrap:!1}}),ce=new y({props:{code:"ZGVmJTIwc3ludGhlc2lzZSh0ZXh0KSUzQSUwQSUyMCUyMCUyMCUyMGlucHV0cyUyMCUzRCUyMHByb2Nlc3Nvcih0ZXh0JTNEdGV4dCUyQyUyMHJldHVybl90ZW5zb3JzJTNEJTIycHQlMjIpJTBBJTIwJTIwJTIwJTIwc3BlZWNoJTIwJTNEJTIwbW9kZWwuZ2VuZXJhdGVfc3BlZWNoKCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGlucHV0cyU1QiUyMmlucHV0X2lkcyUyMiU1RC50byhkZXZpY2UpJTJDJTIwc3BlYWtlcl9lbWJlZGRpbmdzLnRvKGRldmljZSklMkMlMjB2b2NvZGVyJTNEdm9jb2RlciUwQSUyMCUyMCUyMCUyMCklMEElMjAlMjAlMjAlMjByZXR1cm4lMjBzcGVlY2guY3B1KCk=",highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">synthesise</span>(<span class="hljs-params">text</span>):
    inputs = processor(text=text, return_tensors=<span class="hljs-string">&quot;pt&quot;</span>)
    speech = model.generate_speech(
        inputs[<span class="hljs-string">&quot;input_ids&quot;</span>].to(device), speaker_embeddings.to(device), vocoder=vocoder
    )
    <span class="hljs-keyword">return</span> speech.cpu()`,wrap:!1}}),ue=new y({props:{code:"c3BlZWNoJTIwJTNEJTIwc3ludGhlc2lzZSglMjJIZXklMjB0aGVyZSElMjBUaGlzJTIwaXMlMjBhJTIwdGVzdCElMjIpJTBBJTBBQXVkaW8oc3BlZWNoJTJDJTIwcmF0ZSUzRDE2MDAwKQ==",highlighted:`speech = synthesise(<span class="hljs-string">&quot;Hey there! This is a test!&quot;</span>)

Audio(speech, rate=<span class="hljs-number">16000</span>)`,wrap:!1}}),Te=new ge({props:{title:"Создание демо STST",local:"создание-демо-stst",headingTag:"h2"}}),he=new y({props:{code:"aW1wb3J0JTIwbnVtcHklMjBhcyUyMG5wJTBBJTBBdGFyZ2V0X2R0eXBlJTIwJTNEJTIwbnAuaW50MTYlMEFtYXhfcmFuZ2UlMjAlM0QlMjBucC5paW5mbyh0YXJnZXRfZHR5cGUpLm1heCUwQSUwQSUwQWRlZiUyMHNwZWVjaF90b19zcGVlY2hfdHJhbnNsYXRpb24oYXVkaW8pJTNBJTBBJTIwJTIwJTIwJTIwdHJhbnNsYXRlZF90ZXh0JTIwJTNEJTIwdHJhbnNsYXRlKGF1ZGlvKSUwQSUyMCUyMCUyMCUyMHN5bnRoZXNpc2VkX3NwZWVjaCUyMCUzRCUyMHN5bnRoZXNpc2UodHJhbnNsYXRlZF90ZXh0KSUwQSUyMCUyMCUyMCUyMHN5bnRoZXNpc2VkX3NwZWVjaCUyMCUzRCUyMChzeW50aGVzaXNlZF9zcGVlY2gubnVtcHkoKSUyMColMjBtYXhfcmFuZ2UpLmFzdHlwZShucC5pbnQxNiklMEElMjAlMjAlMjAlMjByZXR1cm4lMjAxNjAwMCUyQyUyMHN5bnRoZXNpc2VkX3NwZWVjaA==",highlighted:`<span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np

target_dtype = np.int16
max_range = np.iinfo(target_dtype).<span class="hljs-built_in">max</span>


<span class="hljs-keyword">def</span> <span class="hljs-title function_">speech_to_speech_translation</span>(<span class="hljs-params">audio</span>):
    translated_text = translate(audio)
    synthesised_speech = synthesise(translated_text)
    synthesised_speech = (synthesised_speech.numpy() * max_range).astype(np.int16)
    <span class="hljs-keyword">return</span> <span class="hljs-number">16000</span>, synthesised_speech`,wrap:!1}}),fe=new y({props:{code:"c2FtcGxpbmdfcmF0ZSUyQyUyMHN5bnRoZXNpc2VkX3NwZWVjaCUyMCUzRCUyMHNwZWVjaF90b19zcGVlY2hfdHJhbnNsYXRpb24oc2FtcGxlJTVCJTIyYXVkaW8lMjIlNUQpJTBBJTBBQXVkaW8oc3ludGhlc2lzZWRfc3BlZWNoJTJDJTIwcmF0ZSUzRHNhbXBsaW5nX3JhdGUp",highlighted:`sampling_rate, synthesised_speech = speech_to_speech_translation(sample[<span class="hljs-string">&quot;audio&quot;</span>])

Audio(synthesised_speech, rate=sampling_rate)`,wrap:!1}}),Je=new y({props:{code:"aW1wb3J0JTIwZ3JhZGlvJTIwYXMlMjBnciUwQSUwQWRlbW8lMjAlM0QlMjBnci5CbG9ja3MoKSUwQSUwQW1pY190cmFuc2xhdGUlMjAlM0QlMjBnci5JbnRlcmZhY2UoJTBBJTIwJTIwJTIwJTIwZm4lM0RzcGVlY2hfdG9fc3BlZWNoX3RyYW5zbGF0aW9uJTJDJTBBJTIwJTIwJTIwJTIwaW5wdXRzJTNEZ3IuQXVkaW8oc291cmNlJTNEJTIybWljcm9waG9uZSUyMiUyQyUyMHR5cGUlM0QlMjJmaWxlcGF0aCUyMiklMkMlMEElMjAlMjAlMjAlMjBvdXRwdXRzJTNEZ3IuQXVkaW8obGFiZWwlM0QlMjJHZW5lcmF0ZWQlMjBTcGVlY2glMjIlMkMlMjB0eXBlJTNEJTIybnVtcHklMjIpJTJDJTBBKSUwQSUwQWZpbGVfdHJhbnNsYXRlJTIwJTNEJTIwZ3IuSW50ZXJmYWNlKCUwQSUyMCUyMCUyMCUyMGZuJTNEc3BlZWNoX3RvX3NwZWVjaF90cmFuc2xhdGlvbiUyQyUwQSUyMCUyMCUyMCUyMGlucHV0cyUzRGdyLkF1ZGlvKHNvdXJjZSUzRCUyMnVwbG9hZCUyMiUyQyUyMHR5cGUlM0QlMjJmaWxlcGF0aCUyMiklMkMlMEElMjAlMjAlMjAlMjBvdXRwdXRzJTNEZ3IuQXVkaW8obGFiZWwlM0QlMjJHZW5lcmF0ZWQlMjBTcGVlY2glMjIlMkMlMjB0eXBlJTNEJTIybnVtcHklMjIpJTJDJTBBKSUwQSUwQXdpdGglMjBkZW1vJTNBJTBBJTIwJTIwJTIwJTIwZ3IuVGFiYmVkSW50ZXJmYWNlKCU1Qm1pY190cmFuc2xhdGUlMkMlMjBmaWxlX3RyYW5zbGF0ZSU1RCUyQyUyMCU1QiUyMk1pY3JvcGhvbmUlMjIlMkMlMjAlMjJBdWRpbyUyMEZpbGUlMjIlNUQpJTBBJTBBZGVtby5sYXVuY2goZGVidWclM0RUcnVlKQ==",highlighted:`<span class="hljs-keyword">import</span> gradio <span class="hljs-keyword">as</span> gr

demo = gr.Blocks()

mic_translate = gr.Interface(
    fn=speech_to_speech_translation,
    inputs=gr.Audio(source=<span class="hljs-string">&quot;microphone&quot;</span>, <span class="hljs-built_in">type</span>=<span class="hljs-string">&quot;filepath&quot;</span>),
    outputs=gr.Audio(label=<span class="hljs-string">&quot;Generated Speech&quot;</span>, <span class="hljs-built_in">type</span>=<span class="hljs-string">&quot;numpy&quot;</span>),
)

file_translate = gr.Interface(
    fn=speech_to_speech_translation,
    inputs=gr.Audio(source=<span class="hljs-string">&quot;upload&quot;</span>, <span class="hljs-built_in">type</span>=<span class="hljs-string">&quot;filepath&quot;</span>),
    outputs=gr.Audio(label=<span class="hljs-string">&quot;Generated Speech&quot;</span>, <span class="hljs-built_in">type</span>=<span class="hljs-string">&quot;numpy&quot;</span>),
)

<span class="hljs-keyword">with</span> demo:
    gr.TabbedInterface([mic_translate, file_translate], [<span class="hljs-string">&quot;Microphone&quot;</span>, <span class="hljs-string">&quot;Audio File&quot;</span>])

demo.launch(debug=<span class="hljs-literal">True</span>)`,wrap:!1}}),je=new ge({props:{title:"Двигаемся вперед",local:"двигаемся-вперед",headingTag:"h2"}}),{c(){h=p("meta"),w=a(),d=p("p"),U=a(),c(b.$$.fragment),f=a(),j=p("p"),j.innerHTML=St,Ge=a(),Z=p("div"),Z.innerHTML=It,Ce=a(),v=p("p"),v.innerHTML=Wt,ve=a(),S=p("p"),S.textContent=xt,Se=a(),I=p("p"),I.innerHTML=Nt,Ie=a(),g=p("div"),g.innerHTML=_t,We=a(),W=p("p"),W.innerHTML=kt,xe=a(),x=p("p"),x.innerHTML=Bt,Ne=a(),N=p("p"),N.textContent=Vt,_e=a(),_=p("p"),_.textContent=Xt,ke=a(),c(k.$$.fragment),Be=a(),B=p("p"),B.innerHTML=Ht,Ve=a(),c(V.$$.fragment),Xe=a(),X=p("p"),X.innerHTML=qt,He=a(),c(H.$$.fragment),qe=a(),q=p("p"),q.innerHTML=Yt,Ye=a(),Y=p("p"),Y.textContent=Rt,Re=a(),c(R.$$.fragment),Qe=a(),Q=p("p"),Q.innerHTML=Qt,Fe=a(),c(F.$$.fragment),ze=a(),c(G.$$.fragment),Ee=a(),z=p("p"),z.textContent=Ft,Le=a(),c(E.$$.fragment),Pe=a(),c(L.$$.fragment),Ae=a(),P=p("p"),P.textContent=zt,Ke=a(),c(A.$$.fragment),De=a(),c(K.$$.fragment),Oe=a(),D=p("p"),D.textContent=Et,et=a(),O=p("p"),O.innerHTML=Lt,tt=a(),c(ee.$$.fragment),lt=a(),te=p("p"),te.innerHTML=Pt,st=a(),le=p("p"),le.textContent=At,at=a(),c(se.$$.fragment),nt=a(),c(C.$$.fragment),pt=a(),ae=p("p"),ae.textContent=Kt,it=a(),c(ne.$$.fragment),ot=a(),pe=p("p"),pe.textContent=Dt,ct=a(),c(ie.$$.fragment),rt=a(),oe=p("p"),oe.textContent=Ot,ut=a(),c(ce.$$.fragment),mt=a(),re=p("p"),re.textContent=el,Tt=a(),c(ue.$$.fragment),Mt=a(),me=p("p"),me.textContent=tl,ht=a(),c(Te.$$.fragment),yt=a(),Me=p("p"),Me.innerHTML=ll,ft=a(),c(he.$$.fragment),wt=a(),ye=p("p"),ye.textContent=sl,Jt=a(),c(fe.$$.fragment),dt=a(),we=p("p"),we.textContent=al,Ut=a(),c(Je.$$.fragment),jt=a(),de=p("p"),de.textContent=nl,$t=a(),J=p("iframe"),bt=a(),Ue=p("p"),Ue.innerHTML=il,Zt=a(),c(je.$$.fragment),gt=a(),$e=p("p"),$e.innerHTML=ol,Gt=a(),Ze=p("p"),this.h()},l(e){const t=wl("svelte-u9bgzb",document.head);h=i(t,"META",{name:!0,content:!0}),t.forEach(l),w=n(e),d=i(e,"P",{}),vt(d).forEach(l),U=n(e),r(b.$$.fragment,e),f=n(e),j=i(e,"P",{"data-svelte-h":!0}),o(j)!=="svelte-h8fcu4"&&(j.innerHTML=St),Ge=n(e),Z=i(e,"DIV",{class:!0,"data-svelte-h":!0}),o(Z)!=="svelte-1q8w6r1"&&(Z.innerHTML=It),Ce=n(e),v=i(e,"P",{"data-svelte-h":!0}),o(v)!=="svelte-u1g5a1"&&(v.innerHTML=Wt),ve=n(e),S=i(e,"P",{"data-svelte-h":!0}),o(S)!=="svelte-1mypkhm"&&(S.textContent=xt),Se=n(e),I=i(e,"P",{"data-svelte-h":!0}),o(I)!=="svelte-lw43m6"&&(I.innerHTML=Nt),Ie=n(e),g=i(e,"DIV",{class:!0,"data-svelte-h":!0}),o(g)!=="svelte-55g36w"&&(g.innerHTML=_t),We=n(e),W=i(e,"P",{"data-svelte-h":!0}),o(W)!=="svelte-1kgo5fk"&&(W.innerHTML=kt),xe=n(e),x=i(e,"P",{"data-svelte-h":!0}),o(x)!=="svelte-1jsxu7y"&&(x.innerHTML=Bt),Ne=n(e),N=i(e,"P",{"data-svelte-h":!0}),o(N)!=="svelte-b5k36p"&&(N.textContent=Vt),_e=n(e),_=i(e,"P",{"data-svelte-h":!0}),o(_)!=="svelte-1b6ojjb"&&(_.textContent=Xt),ke=n(e),r(k.$$.fragment,e),Be=n(e),B=i(e,"P",{"data-svelte-h":!0}),o(B)!=="svelte-1o6w0ri"&&(B.innerHTML=Ht),Ve=n(e),r(V.$$.fragment,e),Xe=n(e),X=i(e,"P",{"data-svelte-h":!0}),o(X)!=="svelte-1tnb3zv"&&(X.innerHTML=qt),He=n(e),r(H.$$.fragment,e),qe=n(e),q=i(e,"P",{"data-svelte-h":!0}),o(q)!=="svelte-15aspss"&&(q.innerHTML=Yt),Ye=n(e),Y=i(e,"P",{"data-svelte-h":!0}),o(Y)!=="svelte-nqf6fj"&&(Y.textContent=Rt),Re=n(e),r(R.$$.fragment,e),Qe=n(e),Q=i(e,"P",{"data-svelte-h":!0}),o(Q)!=="svelte-1vzx5wf"&&(Q.innerHTML=Qt),Fe=n(e),r(F.$$.fragment,e),ze=n(e),r(G.$$.fragment,e),Ee=n(e),z=i(e,"P",{"data-svelte-h":!0}),o(z)!=="svelte-rb09f7"&&(z.textContent=Ft),Le=n(e),r(E.$$.fragment,e),Pe=n(e),r(L.$$.fragment,e),Ae=n(e),P=i(e,"P",{"data-svelte-h":!0}),o(P)!=="svelte-i1s2rw"&&(P.textContent=zt),Ke=n(e),r(A.$$.fragment,e),De=n(e),r(K.$$.fragment,e),Oe=n(e),D=i(e,"P",{"data-svelte-h":!0}),o(D)!=="svelte-fub0oz"&&(D.textContent=Et),et=n(e),O=i(e,"P",{"data-svelte-h":!0}),o(O)!=="svelte-vozqmr"&&(O.innerHTML=Lt),tt=n(e),r(ee.$$.fragment,e),lt=n(e),te=i(e,"P",{"data-svelte-h":!0}),o(te)!=="svelte-1twj9iz"&&(te.innerHTML=Pt),st=n(e),le=i(e,"P",{"data-svelte-h":!0}),o(le)!=="svelte-12l4ih2"&&(le.textContent=At),at=n(e),r(se.$$.fragment,e),nt=n(e),r(C.$$.fragment,e),pt=n(e),ae=i(e,"P",{"data-svelte-h":!0}),o(ae)!=="svelte-2losyh"&&(ae.textContent=Kt),it=n(e),r(ne.$$.fragment,e),ot=n(e),pe=i(e,"P",{"data-svelte-h":!0}),o(pe)!=="svelte-3qwbsd"&&(pe.textContent=Dt),ct=n(e),r(ie.$$.fragment,e),rt=n(e),oe=i(e,"P",{"data-svelte-h":!0}),o(oe)!=="svelte-1xt2kle"&&(oe.textContent=Ot),ut=n(e),r(ce.$$.fragment,e),mt=n(e),re=i(e,"P",{"data-svelte-h":!0}),o(re)!=="svelte-xmge0y"&&(re.textContent=el),Tt=n(e),r(ue.$$.fragment,e),Mt=n(e),me=i(e,"P",{"data-svelte-h":!0}),o(me)!=="svelte-wurehp"&&(me.textContent=tl),ht=n(e),r(Te.$$.fragment,e),yt=n(e),Me=i(e,"P",{"data-svelte-h":!0}),o(Me)!=="svelte-1pwzbhg"&&(Me.innerHTML=ll),ft=n(e),r(he.$$.fragment,e),wt=n(e),ye=i(e,"P",{"data-svelte-h":!0}),o(ye)!=="svelte-1l01jij"&&(ye.textContent=sl),Jt=n(e),r(fe.$$.fragment,e),dt=n(e),we=i(e,"P",{"data-svelte-h":!0}),o(we)!=="svelte-zlpv8h"&&(we.textContent=al),Ut=n(e),r(Je.$$.fragment,e),jt=n(e),de=i(e,"P",{"data-svelte-h":!0}),o(de)!=="svelte-1i3rz18"&&(de.textContent=nl),$t=n(e),J=i(e,"IFRAME",{src:!0,frameborder:!0,height:!0,title:!0,class:!0,allow:!0,sandbox:!0}),vt(J).forEach(l),bt=n(e),Ue=i(e,"P",{"data-svelte-h":!0}),o(Ue)!=="svelte-1dnzw5g"&&(Ue.innerHTML=il),Zt=n(e),r(je.$$.fragment,e),gt=n(e),$e=i(e,"P",{"data-svelte-h":!0}),o($e)!=="svelte-18ormmg"&&($e.innerHTML=ol),Gt=n(e),Ze=i(e,"P",{}),vt(Ze).forEach(l),this.h()},h(){$(h,"name","hf:doc:metadata"),$(h,"content",Zl),$(Z,"class","flex justify-center"),$(g,"class","flex justify-center"),Tl(J.src,pl="https://course-demos-speech-to-speech-translation.hf.space")||$(J,"src",pl),$(J,"frameborder","0"),$(J,"height","450"),$(J,"title","Gradio app"),$(J,"class","container p-0 flex-grow space-iframe"),$(J,"allow","accelerometer; ambient-light-sensor; autoplay; battery; camera; document-domain; encrypted-media; fullscreen; geolocation; gyroscope; layout-animations; legacy-image-formats; magnetometer; microphone; midi; oversized-images; payment; picture-in-picture; publickey-credentials-get; sync-xhr; usb; vr ; wake-lock; xr-spatial-tracking"),$(J,"sandbox","allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads")},m(e,t){Jl(document.head,h),s(e,w,t),s(e,d,t),s(e,U,t),u(b,e,t),s(e,f,t),s(e,j,t),s(e,Ge,t),s(e,Z,t),s(e,Ce,t),s(e,v,t),s(e,ve,t),s(e,S,t),s(e,Se,t),s(e,I,t),s(e,Ie,t),s(e,g,t),s(e,We,t),s(e,W,t),s(e,xe,t),s(e,x,t),s(e,Ne,t),s(e,N,t),s(e,_e,t),s(e,_,t),s(e,ke,t),u(k,e,t),s(e,Be,t),s(e,B,t),s(e,Ve,t),u(V,e,t),s(e,Xe,t),s(e,X,t),s(e,He,t),u(H,e,t),s(e,qe,t),s(e,q,t),s(e,Ye,t),s(e,Y,t),s(e,Re,t),u(R,e,t),s(e,Qe,t),s(e,Q,t),s(e,Fe,t),u(F,e,t),s(e,ze,t),u(G,e,t),s(e,Ee,t),s(e,z,t),s(e,Le,t),u(E,e,t),s(e,Pe,t),u(L,e,t),s(e,Ae,t),s(e,P,t),s(e,Ke,t),u(A,e,t),s(e,De,t),u(K,e,t),s(e,Oe,t),s(e,D,t),s(e,et,t),s(e,O,t),s(e,tt,t),u(ee,e,t),s(e,lt,t),s(e,te,t),s(e,st,t),s(e,le,t),s(e,at,t),u(se,e,t),s(e,nt,t),u(C,e,t),s(e,pt,t),s(e,ae,t),s(e,it,t),u(ne,e,t),s(e,ot,t),s(e,pe,t),s(e,ct,t),u(ie,e,t),s(e,rt,t),s(e,oe,t),s(e,ut,t),u(ce,e,t),s(e,mt,t),s(e,re,t),s(e,Tt,t),u(ue,e,t),s(e,Mt,t),s(e,me,t),s(e,ht,t),u(Te,e,t),s(e,yt,t),s(e,Me,t),s(e,ft,t),u(he,e,t),s(e,wt,t),s(e,ye,t),s(e,Jt,t),u(fe,e,t),s(e,dt,t),s(e,we,t),s(e,Ut,t),u(Je,e,t),s(e,jt,t),s(e,de,t),s(e,$t,t),s(e,J,t),s(e,bt,t),s(e,Ue,t),s(e,Zt,t),u(je,e,t),s(e,gt,t),s(e,$e,t),s(e,Gt,t),s(e,Ze,t),Ct=!0},p(e,[t]){const cl={};t&2&&(cl.$$scope={dirty:t,ctx:e}),G.$set(cl);const rl={};t&2&&(rl.$$scope={dirty:t,ctx:e}),C.$set(rl)},i(e){Ct||(m(b.$$.fragment,e),m(k.$$.fragment,e),m(V.$$.fragment,e),m(H.$$.fragment,e),m(R.$$.fragment,e),m(F.$$.fragment,e),m(G.$$.fragment,e),m(E.$$.fragment,e),m(L.$$.fragment,e),m(A.$$.fragment,e),m(K.$$.fragment,e),m(ee.$$.fragment,e),m(se.$$.fragment,e),m(C.$$.fragment,e),m(ne.$$.fragment,e),m(ie.$$.fragment,e),m(ce.$$.fragment,e),m(ue.$$.fragment,e),m(Te.$$.fragment,e),m(he.$$.fragment,e),m(fe.$$.fragment,e),m(Je.$$.fragment,e),m(je.$$.fragment,e),Ct=!0)},o(e){T(b.$$.fragment,e),T(k.$$.fragment,e),T(V.$$.fragment,e),T(H.$$.fragment,e),T(R.$$.fragment,e),T(F.$$.fragment,e),T(G.$$.fragment,e),T(E.$$.fragment,e),T(L.$$.fragment,e),T(A.$$.fragment,e),T(K.$$.fragment,e),T(ee.$$.fragment,e),T(se.$$.fragment,e),T(C.$$.fragment,e),T(ne.$$.fragment,e),T(ie.$$.fragment,e),T(ce.$$.fragment,e),T(ue.$$.fragment,e),T(Te.$$.fragment,e),T(he.$$.fragment,e),T(fe.$$.fragment,e),T(Je.$$.fragment,e),T(je.$$.fragment,e),Ct=!1},d(e){e&&(l(w),l(d),l(U),l(f),l(j),l(Ge),l(Z),l(Ce),l(v),l(ve),l(S),l(Se),l(I),l(Ie),l(g),l(We),l(W),l(xe),l(x),l(Ne),l(N),l(_e),l(_),l(ke),l(Be),l(B),l(Ve),l(Xe),l(X),l(He),l(qe),l(q),l(Ye),l(Y),l(Re),l(Qe),l(Q),l(Fe),l(ze),l(Ee),l(z),l(Le),l(Pe),l(Ae),l(P),l(Ke),l(De),l(Oe),l(D),l(et),l(O),l(tt),l(lt),l(te),l(st),l(le),l(at),l(nt),l(pt),l(ae),l(it),l(ot),l(pe),l(ct),l(rt),l(oe),l(ut),l(mt),l(re),l(Tt),l(Mt),l(me),l(ht),l(yt),l(Me),l(ft),l(wt),l(ye),l(Jt),l(dt),l(we),l(Ut),l(jt),l(de),l($t),l(J),l(bt),l(Ue),l(Zt),l(gt),l($e),l(Gt),l(Ze)),l(h),M(b,e),M(k,e),M(V,e),M(H,e),M(R,e),M(F,e),M(G,e),M(E,e),M(L,e),M(A,e),M(K,e),M(ee,e),M(se,e),M(C,e),M(ne,e),M(ie,e),M(ce,e),M(ue,e),M(Te,e),M(he,e),M(fe,e),M(Je,e),M(je,e)}}}const Zl='{"title":"Перевод Speech-to-speech","local":"перевод-speech-to-speech","sections":[{"title":"Перевод речи","local":"перевод-речи","sections":[],"depth":2},{"title":"Преобразование текста в речь","local":"преобразование-текста-в-речь","sections":[],"depth":2},{"title":"Создание демо STST","local":"создание-демо-stst","sections":[],"depth":2},{"title":"Двигаемся вперед","local":"двигаемся-вперед","sections":[],"depth":2}],"depth":1}';function gl(be){return Ml(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class Wl extends yl{constructor(h){super(),fl(this,h,gl,bl,ml,{})}}export{Wl as component};
