Buckets:
| <meta charset="utf-8" /><meta name="hf:doc:metadata" content="{"title":"Введение в аудиоданные","local":"введение-в-аудиоданные","sections":[{"title":"Выборка и частота дискретизации","local":"выборка-и-частота-дискретизации","sections":[],"depth":2},{"title":"Амплитуда и битовая глубина","local":"амплитуда-и-битовая-глубина","sections":[],"depth":2},{"title":"Аудио как форма волны","local":"аудио-как-форма-волны","sections":[],"depth":2},{"title":"Частотный спектр","local":"частотный-спектр","sections":[],"depth":2},{"title":"Спектрограмма","local":"спектрограмма","sections":[],"depth":2},{"title":"Мэл спектрограмма","local":"мэл-спектрограмма","sections":[],"depth":2}],"depth":1}"> | |
| <link href="/docs/audio-course/pr_239/ru/_app/immutable/assets/0.e3b0c442.css" rel="modulepreload"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/ru/_app/immutable/entry/start.13cec9b0.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/ru/_app/immutable/chunks/scheduler.cd324960.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/ru/_app/immutable/chunks/singletons.48cedec4.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/ru/_app/immutable/chunks/index.a0c12d66.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/ru/_app/immutable/chunks/paths.fcdbf8b6.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/ru/_app/immutable/entry/app.af2704da.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/ru/_app/immutable/chunks/preload-helper.6ae502d0.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/ru/_app/immutable/chunks/index.d5c3adcc.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/ru/_app/immutable/nodes/0.7f9b0aee.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/ru/_app/immutable/chunks/each.e59479a4.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/ru/_app/immutable/nodes/5.1a899137.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/ru/_app/immutable/chunks/Tip.889bec11.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/ru/_app/immutable/chunks/MermaidChart.svelte_svelte_type_style_lang.00c8a5a8.js"> | |
| <link rel="modulepreload" href="/docs/audio-course/pr_239/ru/_app/immutable/chunks/CodeBlock.693662e4.js"><!-- HEAD_svelte-u9bgzb_START --><meta name="hf:doc:metadata" content="{"title":"Введение в аудиоданные","local":"введение-в-аудиоданные","sections":[{"title":"Выборка и частота дискретизации","local":"выборка-и-частота-дискретизации","sections":[],"depth":2},{"title":"Амплитуда и битовая глубина","local":"амплитуда-и-битовая-глубина","sections":[],"depth":2},{"title":"Аудио как форма волны","local":"аудио-как-форма-волны","sections":[],"depth":2},{"title":"Частотный спектр","local":"частотный-спектр","sections":[],"depth":2},{"title":"Спектрограмма","local":"спектрограмма","sections":[],"depth":2},{"title":"Мэл спектрограмма","local":"мэл-спектрограмма","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="введение-в-аудиоданные" 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="#введение-в-аудиоданные"><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>Введение в аудиоданные</span></h1> <p data-svelte-h="svelte-1chqjcj">По своей природе звуковая волна является непрерывным сигналом, то есть содержит бесконечное число значений сигнала за определенное время. | |
| Это создает проблемы для цифровых устройств, которые ожидают конечные массивы. Для обработки, хранения и передачи сигнала цифровыми устройствами, | |
| непрерывная звуковая волна должна быть преобразована в ряд дискретных значений, называемых цифровым представлением.</p> <p data-svelte-h="svelte-nv6sv6">Если обратиться к любому набору аудиоданных, то можно найти цифровые файлы со звуковыми фрагментами, например, с текстовым повествованием или музыкой. | |
| Вы можете встретить различные форматы файлов, такие как <code>.wav</code> (Waveform Audio File), <code>.flac</code> (Free Lossless Audio Codec), | |
| <code>.mp3</code> (MPEG-1 Audio Layer 3). Эти форматы различаются главным образом способом сжатия цифрового представления аудиосигнала.</p> <p data-svelte-h="svelte-gdazuk">Рассмотрим, как мы приходим от непрерывного сигнала к такому представлению. Сначала аналоговый сигнал улавливается | |
| микрофоном, который преобразует звуковые волны в электрический сигнал. Затем электрический сигнал оцифровывается с помощью | |
| Аналого-Цифрового Преобразователя для получения цифрового представления путем дискретизации.</p> <h2 class="relative group"><a id="выборка-и-частота-дискретизации" 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="#выборка-и-частота-дискретизации"><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>Выборка и частота дискретизации</span></h2> <p data-svelte-h="svelte-1v6lspc">Выборка (сэмлирование, дискретизация) - это процесс измерения значения непрерывного сигнала с фиксированным шагом по времени. Выборочная форма сигнала является <em>дискретной</em>, | |
| поскольку содержит конечное число значений сигнала через равномерные интервалы времени.</p> <div class="flex justify-center" data-svelte-h="svelte-6m8o8w"><img src="https://huggingface.co/datasets/huggingface-course/audio-course-images/resolve/main/Signal_Sampling.png" alt="Иллюстрация дискретизации сигнала"></div> <p data-svelte-h="svelte-86tr4v"><em>Иллюстрация из статьи Википедии: <a href="https://en.wikipedia.org/wiki/Sampling_(signal_processing)" rel="nofollow">Сэмплирование (обработка сигналов)</a></em></p> <p data-svelte-h="svelte-lun4an"><strong>Частота выборки (сэмплирования)</strong> (также называемая частотой дискретизации) - это количество выборок, сделанных за одну секунд измеряемое в | |
| герцах (Гц). Чтобы дать вам примерную точку отсчета, частота дискретизации аудиофайлов CD-качества составляет 44 100 Гц, то есть выборки делаются | |
| 44 100 раз в секунду. Для сравнения, частота дискретизации звука высокого разрешения составляет 192 000 Гц или 192 кГц. Обычно | |
| частота дискретизации, используемая при обучении речевых моделей, составляет 16 000 Гц или 16 кГц.</p> <p data-svelte-h="svelte-4n9zzm">Выбор частоты дискретизации в первую очередь определяет наивысшую частоту, которая может быть извлечена из сигнала. Это значение также, | |
| известно как предел Найквиста, и составляет ровно половину частоты дискретизации. Слышимые частоты в человеческой речи лежат ниже 8 кГц, | |
| поэтому для дискретизации речи достаточно 16 кГц. Использование более высокой частоты дискретизации не позволяет получить больше информации и | |
| только приведет к увеличению вычислительных затрат на обработку таких файлов. С другой стороны, дискретизация звука при слишком | |
| низкой частоте дискретизации приводит к потере информации. Речь, дискретизированная с частотой 8 кГц, будет звучать приглушенно, так как более высокие частоты | |
| не могут быть захвачены при такой частоте дискретизации.</p> <p data-svelte-h="svelte-5erhoc">При работе над любой аудио задачей важно убедиться, что все примеры звука в вашем наборе данных имеют одинаковую частоту дискретизации. | |
| Если вы планируете использовать пользовательские аудиоданные для дообучения предварительно обученной модели, то частота дискретизации ваших данных должна соответствовать частоте дискретизации данных, на которых была предварительно обучена модель. Частота дискретизации определяет временной интервал между последовательными | |
| выборками звука, что влияет на временное разрешение аудиоданных. Рассмотрим пример: 5-секундный звук при частоте дискретизации | |
| 16 000 Гц будет представлен в виде серии из 80 000 значений, а тот же 5-секундный звук при частоте дискретизации | |
| 8 000 Гц будет представлен в виде серии из 40 000 значений. Модели трансформеров, решающие аудиозадачи, рассматривают примеры как последовательности | |
| и полагаются на механизмы внимания для обучения аудио или мультимодальному представлению. Поскольку последовательности данных различны для | |
| аудиопримеров с разной частотой дискретизации, то моделям будет сложно обобщать данные для разных частот дискретизации. | |
| <strong>Передискретизация</strong> - это процесс согласования частот дискретизации, являющийся частью <a href="preprocessing#resampling-the-audio-data">препроцессинга</a> аудиоданных.</p> <h2 class="relative group"><a id="амплитуда-и-битовая-глубина" 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="#амплитуда-и-битовая-глубина"><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>Амплитуда и битовая глубина</span></h2> <p data-svelte-h="svelte-1746nr3">В то время как частота дискретизации говорит о том, как часто происходит выборка образцов, какие именно значения содержатся в каждом образце?</p> <p data-svelte-h="svelte-1igs912">Звук возникает в результате изменения давления воздуха на частотах, слышимых человеком. <strong>Амплитуда</strong> звука характеризует | |
| уровень звукового давления в любой момент времени и измеряется в децибелах (дБ). Мы воспринимаем амплитуду как громкость. | |
| Для примера, обычный разговор не превышает 60 дБ, а рок-концерт может достигать 125 дБ, что является пределом | |
| для человеческого слуха.</p> <p data-svelte-h="svelte-e92kg0">В цифровом аудио каждый образец звука фиксирует амплитуду звуковой волны в определенный момент времени. <strong>Битовая глубина</strong> образца звука | |
| определяет, с какой точностью может быть описано это значение амплитуды. Чем выше битовая глубина, тем точнее | |
| цифровое представление приближается к исходной непрерывной звуковой волне.</p> <p data-svelte-h="svelte-1nbvlfl">Наиболее распространенные битовые глубины звука - 16 и 24 бита. Каждая из них представляет собой двоичный термин, обозначающий количество возможных шагов, | |
| на которое можно квантовать амплитудное значение при его преобразовании из непрерывного в дискретное: 65 536 шагов для 16-битного звука, | |
| для 24-битного звука - 16 777 216 шагов. Поскольку при квантовании происходит округление непрерывного значения до дискретного, | |
| процесс дискретизации вносит шум. Чем выше битовая глубина, тем меньше этот шум квантования. На практике | |
| шум квантования 16-битного звука уже достаточно мал, чтобы быть неслышимым, и использование большей битовой глубины обычно | |
| не требуется.</p> <p data-svelte-h="svelte-l3sskq">Вы также можете встретить 32-битные аудио. В нем выборки хранятся в виде значений с плавающей точкой, тогда как в 16- и 24-битном аудио | |
| используются целочисленные выборки. Точность 32-битного значения с плавающей точкой составляет 24 бита, что дает такую же битовую глубину, как и у 24-битного звука. | |
| Предполагается, что аудио выборки с плавающей точкой лежат в диапазоне [-1,0, 1,0]. Поскольку модели машинного обучения естественным образом | |
| работают с данными в формате с плавающей точкой, перед тем как использовать их для обучения модели, аудиоданные необходимо преобразовать в формат с плавающей точкой. | |
| Как это сделать, мы рассмотрим в следующем разделе <a href="preprocessing">Препроцессинг</a>.</p> <p data-svelte-h="svelte-195d0xw">Как и в случае с непрерывными звуковыми сигналами, амплитуда цифрового звука обычно выражается в децибелах (дБ). Поскольку | |
| слух человека имеет логарифмическую природу - наши уши более чувствительны к небольшим колебаниям тихих звуков, чем громких, | |
| то громкость звука легче интерпретировать, если амплитуды выражены в децибелах, которые также являются логарифмическими. | |
| Децибельная шкала для реального звука начинается с 0 дБ, что соответствует самому тихому звуку, который может услышать человек, а | |
| более громкие звуки имеют большие значения. Однако для цифровых аудиосигналов 0 дБ - это самая громкая возможная амплитуда, а все | |
| остальные амплитуды отрицательны. Краткое эмпирическое правило: каждые -6 дБ - это уменьшение амплитуды вдвое, и все, что ниже -60 дБ | |
| обычно неслышно, если только вы не увеличите громкость.</p> <h2 class="relative group"><a id="аудио-как-форма-волны" 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="#аудио-как-форма-волны"><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>Аудио как форма волны</span></h2> <p data-svelte-h="svelte-1feje3o">Возможно, вам приходилось видеть визуализацию звуков в виде <strong>формы волны</strong>, которая отображает значения отсчетов во времени и иллюстрирует изменения | |
| амплитуды звука. Такое представление звука называется <em>временной областью</em>.</p> <p data-svelte-h="svelte-9eyasx">Этот тип визуализации полезен для выявления специфических особенностей аудиосигнала, таких как время появления отдельных звуковых событий, | |
| общая громкость сигнала, неравномерности или шумы, присутствующие в аудиосигнале.</p> <p data-svelte-h="svelte-eje8hy">Для построения графика формы волны аудиосигнала можно использовать библиотеку Python <code>librosa</code>:</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" 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> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START -->pip install librosa<!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-lh0uei">Возьмем для примера звук “Трубы”, который поставляется вместе с библиотекой::</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" 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> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START --><span class="hljs-keyword">import</span> librosa | |
| array, sampling_rate = librosa.load(librosa.ex(<span class="hljs-string">"trumpet"</span>))<!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-nmja6m">Пример загружается в виде кортежа состоящего из временного ряда звука (здесь мы называем его <code>array</code>), и частоты дискретизации (<code>sampling_rate</code>). | |
| Посмотрим на форму волны этого звука с помощью функции librosa <code>waveshow()</code>:</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" 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> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START --><span class="hljs-keyword">import</span> matplotlib.pyplot <span class="hljs-keyword">as</span> plt | |
| <span class="hljs-keyword">import</span> librosa.display | |
| plt.figure().set_figwidth(<span class="hljs-number">12</span>) | |
| librosa.display.waveshow(array, sr=sampling_rate)<!-- HTML_TAG_END --></pre></div> <div class="flex justify-center" data-svelte-h="svelte-1cse5se"><img src="https://huggingface.co/datasets/huggingface-course/audio-course-images/resolve/main/waveform_plot.png" alt="Waveform plot"></div> <p data-svelte-h="svelte-14zfq5d">При этом по оси y откладывается амплитуда сигнала, а по оси x - время. Другими словами, каждая точка соответствует | |
| одному значению выборки, которое было взято при сэмплировании этого звука. Также отметим, что librosa возвращает звук уже в виде значений | |
| с плавающей точкой, при этом значения амплитуды действительно находятся в диапазоне [-1.0, 1.0].</p> <p data-svelte-h="svelte-1e56usl">Визуализация звука наряду с его прослушиванием может быть полезным инструментом для понимания данных, с которыми вы работаете. | |
| Вы можете увидеть форму сигнала, заметить закономерности, научиться выявлять шумы или искажения. При предварительной обработке данных, | |
| например, нормализации, повторной выборке или фильтрации, можно визуально убедиться в том, что этапы предварительной обработки были выполнены как ожидалось. | |
| После обучения модели можно также визуализировать примеры, в которых возникают ошибки (например, в задаче классификации звука), для отладки | |
| возникающих проблем.</p> <h2 class="relative group"><a id="частотный-спектр" 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="#частотный-спектр"><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>Частотный спектр</span></h2> <p data-svelte-h="svelte-d3qf5z">Другим способом визуализации аудиоданных является построение <strong>частотного спектра</strong> аудиосигнала, также известное как <strong>частотный интервал</strong>. | |
| Спектр вычисляется с помощью Дискретного Преобразования Фурье или ДПФ (Discrete Fourier Transform - DFT). Он описывает отдельные частоты, | |
| из которых состоит сигнал, и их силу.</p> <p data-svelte-h="svelte-l81c8x">Построим частотный спектр для того же звука трубы, взяв ДПФ с помощью функции numpy <code>rfft()</code>. Хотя | |
| можно построить спектр всего звука, удобнее рассматривать небольшую область. Здесь мы возьмем | |
| ДПФ первых 4096 выборок, что приблизительно равно длительности первой сыгранной ноты:</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" 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> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START --><span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np | |
| dft_input = array[:<span class="hljs-number">4096</span>] | |
| <span class="hljs-comment"># Рассчитаем ДПФ</span> | |
| window = np.hanning(<span class="hljs-built_in">len</span>(dft_input)) | |
| windowed_input = dft_input * window | |
| dft = np.fft.rfft(windowed_input) | |
| <span class="hljs-comment"># получим амплитудный спектр в децибелах</span> | |
| amplitude = np.<span class="hljs-built_in">abs</span>(dft) | |
| amplitude_db = librosa.amplitude_to_db(amplitude, ref=np.<span class="hljs-built_in">max</span>) | |
| <span class="hljs-comment"># получим частотные столбцы</span> | |
| frequency = librosa.fft_frequencies(sr=sampling_rate, n_fft=<span class="hljs-built_in">len</span>(dft_input)) | |
| plt.figure().set_figwidth(<span class="hljs-number">12</span>) | |
| plt.plot(frequency, amplitude_db) | |
| plt.xlabel(<span class="hljs-string">"Frequency (Hz)"</span>) | |
| plt.ylabel(<span class="hljs-string">"Amplitude (dB)"</span>) | |
| plt.xscale(<span class="hljs-string">"log"</span>)<!-- HTML_TAG_END --></pre></div> <div class="flex justify-center" data-svelte-h="svelte-1eg4i6m"><img src="https://huggingface.co/datasets/huggingface-course/audio-course-images/resolve/main/spectrum_plot.png" alt="Spectrum plot"></div> <p data-svelte-h="svelte-1tjxpp7">Здесь отображается сила различных частотных составляющих, присутствующих в данном аудио сегменте. На оси x | |
| откладываются значения частот, обычно в логарифмическом масштабе, а по оси y - их амплитуды.</p> <p data-svelte-h="svelte-1vixw2s">Построенный нами частотный спектр имеет несколько пиков. Эти пики соответствуют гармоникам исполняемой ноты, | |
| причем более высокие гармоники более тихие. Поскольку первый пик находится на частоте около 620 Гц, это частотный спектр ноты E♭.</p> <p data-svelte-h="svelte-hpkthg">На выходе ДПФ получается массив комплексных чисел, состоящий из действительной и мнимой компонент. Взяв | |
| величину с помощью <code>np.abs(dft)</code>, можно извлечь из спектрограммы амплитудную информацию. Угол между действительной и | |
| мнимой составляющими дает так называемый фазовый спектр, но в приложениях машинного обучения он часто отбрасывается.</p> <p data-svelte-h="svelte-1tlrt6j">Вы использовали <code>librosa.amplitude_to_db()</code> для преобразования значений амплитуды в децибельную шкалу, что облегчает просмотр | |
| более тонких деталей в спектре. Иногда используют <strong>энергетический спектр</strong>, который измеряет энергию, а не амплитуду; | |
| это просто спектр с квадратом амплитудных значений.</p> <blockquote class="tip">💡 На практике термин БПФ (Fast Fourier Transform - FFT) используется как взаимозаменяемый с термином ДПФ, поскольку БПФ или быстрое преобразование Фурье является единственным эффективным способ вычисления ДПФ на компьютере.</blockquote> <p data-svelte-h="svelte-13s1elr">Частотный спектр аудиосигнала содержит точно такую же информацию, как и его волновая форма, - это просто два разных способа | |
| взглянуть на одни и те же данные (здесь - первые 4096 выборок из звука трубы). Если волновая форма отображает амплитуду | |
| звукового сигнала во времени, то спектр представляет амплитуды отдельных частот в фиксированный момент времени.</p> <h2 class="relative group"><a id="спектрограмма" 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="#спектрограмма"><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>Спектрограмма</span></h2> <p data-svelte-h="svelte-s5fb2v">Что если мы хотим увидеть, как изменяются частоты в аудиосигнале? Труба играет несколько нот, и все они имеют | |
| разные частоты. Проблема в том, что спектр показывает только застывший снимок частот в данный момент времени. | |
| Решение состоит в том, чтобы взять несколько ДПФ, каждый из которых охватывает лишь небольшой отрезок времени, и сложить полученные спектры вместе | |
| в <strong>спектрограмму</strong>.</p> <p data-svelte-h="svelte-1rweuw5">Спектрограмма представляет собой график изменения частотного содержания звукового сигнала во времени. Она позволяет увидеть время, частоту, | |
| и амплитуду на одном графике. Алгоритм, выполняющий эти вычисления, называется ОПФ или Оконное Преобразование Фурье (Short Time Fourier Transform - STFT).</p> <p data-svelte-h="svelte-1oydmel">Спектрограмма является одним из наиболее информативных аудио инструментов. Например, при работе с музыкальной записью | |
| можно увидеть различные инструменты и вокальные дорожки и их вклад в общее звучание. В речи можно | |
| идентифицировать различные гласные звуки, поскольку каждый гласный звук характеризуется определенными частотами.</p> <p data-svelte-h="svelte-1tt8nmd">Построим спектрограмму для того же звука трубы, используя функции библиотеки librosa <code>stft()</code> и <code>specshow()</code>:</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" 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> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START --><span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np | |
| D = librosa.stft(array) | |
| S_db = librosa.amplitude_to_db(np.<span class="hljs-built_in">abs</span>(D), ref=np.<span class="hljs-built_in">max</span>) | |
| plt.figure().set_figwidth(<span class="hljs-number">12</span>) | |
| librosa.display.specshow(S_db, x_axis=<span class="hljs-string">"time"</span>, y_axis=<span class="hljs-string">"hz"</span>) | |
| plt.colorbar()<!-- HTML_TAG_END --></pre></div> <div class="flex justify-center" data-svelte-h="svelte-b6kbs6"><img src="https://huggingface.co/datasets/huggingface-course/audio-course-images/resolve/main/spectrogram_plot.png" alt="Spectrogram plot"></div> <p data-svelte-h="svelte-1i9q2vb">На этом графике ось x представляет собой время, как и при визуализации формы волны, но теперь ось y представляет собой частоту в Гц. | |
| Интенсивность цвета показывает амплитуду или мощность частотной составляющей в каждый момент времени, измеряемую в децибелах (дБ).</p> <p data-svelte-h="svelte-190ovr2">Спектрограмма создается путем выделения коротких сегментов аудиосигнала, как правило, длительностью несколько миллисекунд, и вычисления | |
| дискретного преобразования Фурье каждого сегмента для получения его частотного спектра. Полученные спектры складываются | |
| вместе по оси времени для получения спектрограммы. Каждый вертикальный срез на этом изображении соответствует одному частотному | |
| спектру, если смотреть сверху. По умолчанию <code>librosa.stft()</code> разбивает аудиосигнал на сегменты по 2048 выборок, что | |
| дает хороший компромисс между частотным и временным разрешением.</p> <p data-svelte-h="svelte-tyj6up">Поскольку спектрограмма и волновая форма - это разные представления одних и тех же данных, то с помощью обратного ОПФ можно превратить спектрограмму обратно | |
| в исходную волновую форму. Однако для этого помимо информации об амплитуде | |
| требуется информация о фазе. Если спектрограмма была сгенерирована моделью машинного обучения, то она, как правило, выдает только амплитуды. | |
| В этом случае для восстановления формы волны из спектрограммы можно использовать алгоритм восстановления фазы, например, классический алгоритм Гриффина-Лима, | |
| или нейронную сеть, называемую вокодером.</p> <p data-svelte-h="svelte-eqphqv">Спектрограммы используются не только для визуализации. Многие модели машинного обучения принимают на вход спектрограммы - в отличие от | |
| формы волны - и выдают на выходе спектрограммы.</p> <p data-svelte-h="svelte-b1mu0b">Теперь, когда мы знаем, что такое спектрограмма и как она строится, рассмотрим ее разновидность, широко используемую при обработке речи, - Мел спектрограмму.</p> <h2 class="relative group"><a id="мэл-спектрограмма" 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="#мэл-спектрограмма"><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>Мэл спектрограмма</span></h2> <p data-svelte-h="svelte-1qvr3fq">Мел-спектрограмма - это разновидность спектрограммы, которая широко используется в задачах обработки речи и машинного обучения. | |
| Она похожа на спектрограмму тем, что показывает частотное содержание аудиосигнала во времени, но на другой частотной оси.</p> <p data-svelte-h="svelte-1yspzqq">В стандартной спектрограмме частотная ось линейна и измеряется в герцах (Гц). Однако слуховая система человека | |
| более чувствительна к изменениям на низких частотах, чем на высоких, и эта чувствительность уменьшается логарифмически | |
| с увеличением частоты. Шкала Мэл - это перцептивная шкала, которая аппроксимирует нелинейную частотную характеристику человеческого уха.</p> <p data-svelte-h="svelte-176de6r">Для создания мэл спектрограммы, как и ранее, используется ОПФ, при этом аудиосигнал разбивается на короткие сегменты для получения последовательности | |
| частотных спектров. Кроме того, каждый спектр пропускается через набор фильтров, так называемый банк фильтров мэла, для [NL1] преобразования частот в Мэл шкалу.</p> <p data-svelte-h="svelte-1t216nt">Рассмотрим, как можно построить мэл спектрограмму с помощью функции librosa <code>melspectrogram()</code>, которая выполняет все эти действия за нас:</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" 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> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START -->S = librosa.feature.melspectrogram(y=array, sr=sampling_rate, n_mels=<span class="hljs-number">128</span>, fmax=<span class="hljs-number">8000</span>) | |
| S_dB = librosa.power_to_db(S, ref=np.<span class="hljs-built_in">max</span>) | |
| plt.figure().set_figwidth(<span class="hljs-number">12</span>) | |
| librosa.display.specshow(S_dB, x_axis=<span class="hljs-string">"time"</span>, y_axis=<span class="hljs-string">"mel"</span>, sr=sampling_rate, fmax=<span class="hljs-number">8000</span>) | |
| plt.colorbar()<!-- HTML_TAG_END --></pre></div> <div class="flex justify-center" data-svelte-h="svelte-1soplef"><img src="https://huggingface.co/datasets/huggingface-course/audio-course-images/resolve/main/mel-spectrogram.png" alt="Mel spectrogram plot"></div> <p data-svelte-h="svelte-1uwf1ab">В приведенном примере <code>n_mels</code> означает количество генерируемых мэл диапазонов. Мел диапазоны определяют набор частотных | |
| диапазонов, которые разделяют спектр на перцептивно значимые компоненты, используя набор фильтров, форма и расстояние между которыми | |
| выбираются таким образом, чтобы имитировать реакцию человеческого уха на различные частоты. Обычные значения для <code>n_mels</code> это 40 или 80. <code>fmax</code> | |
| указывает максимальную частоту (в Гц), которая нас интересует.</p> <p data-svelte-h="svelte-vugdu6">Как и в случае с обычной спектрограммой, принято выражать силу мел-частотных компонентов в | |
| децибелах. Такую спектрограмму принято называть <strong>лог-мэл-спектрограммой</strong>, поскольку при переводе в децибелы выполняется | |
| логарифмическая операция. В приведенном выше примере использовалась функция <code>librosa.power_to_db()</code>, так как <code>librosa.feature.melspectrogram()</code> создает спектрограмму мощности.</p> <blockquote class="tip">💡 Не все мэл спектрограммы одинаковы! Существуют две различные шкалы мэл, которые широко используются ("htk" и "slaney"), | |
| а вместо спектрограммы мощности может использоваться амплитудная спектрограмма. При преобразовании спектрограммы в лог-мел не всегда | |
| вычисляются истинные децибелы, а может просто браться `log`. Поэтому, если модель машинного обучения ожидает в качестве входных данных спектрограмму мел, | |
| дважды проверьте, что она вычисляется тем же способом.</blockquote> <p data-svelte-h="svelte-1vrh2vz">Создание mel-спектрограммы - это операция с потерями, так как она связана с фильтрацией сигнала. Конвертировать mel-спектрограмму обратно | |
| в волновую форму сложнее, чем обычную спектрограмму, так как для этого необходимо оценить частоты, | |
| которые были отброшены. Поэтому для получения формы волны из мэл спектрограммы необходимы модели машинного обучения, | |
| такие как вокодер HiFiGAN.</p> <p data-svelte-h="svelte-nlz2j6">По сравнению со стандартной спектрограммой, мэл спектрограмма может отражать более значимые для восприятия человеком особенности аудиосигнала, | |
| что делает ее популярной в таких задачах, как распознавание речи, идентификация диктора и классификация музыкальных жанров.</p> <p data-svelte-h="svelte-1tv07ks">Теперь, когда вы знаете, как визуализировать примеры аудиоданных, попробуйте посмотреть, как выглядят ваши любимые звуки. :)</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/ru/chapter1/audio_data.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_a3glb3 = { | |
| assets: "/docs/audio-course/pr_239/ru", | |
| base: "/docs/audio-course/pr_239/ru", | |
| env: {} | |
| }; | |
| const element = document.currentScript.parentElement; | |
| const data = [null,null]; | |
| Promise.all([ | |
| import("/docs/audio-course/pr_239/ru/_app/immutable/entry/start.13cec9b0.js"), | |
| import("/docs/audio-course/pr_239/ru/_app/immutable/entry/app.af2704da.js") | |
| ]).then(([kit, app]) => { | |
| kit.start(app, element, { | |
| node_ids: [0, 5], | |
| data, | |
| form: null, | |
| error: null | |
| }); | |
| }); | |
| } | |
| </script> | |
Xet Storage Details
- Size:
- 59.7 kB
- Xet hash:
- 98559c68659821447467779e0dac0c769d024556db8d3606d2039ac8bb77caa6
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.