Библиотека конверсии скорости выбывания звука для ржавчины.
Эта библиотека обеспечивает повторные часы для обработки звука в кусках.
Соотношение между входными и выходными показателями дискретизации полностью бесплатно. Доступны реализации, которые принимают вход с фиксированной длиной при возврате выхода переменной длины, и наоборот.
Рубато может использоваться в приложениях в реальном времени без какого -либо распределения во время обработки путем предварительного плавания [resampler] и используя его методы input_buffer_allocate и output_buffer_allocate перед началом обработки. Функция функции журнала должна быть отключена для использования в реальном времени (по умолчанию отключена).
Входные и выходные данные хранятся в непревзойденном формате.
Входные и выходные данные хранятся как срезы ссылок, &[AsRef<[f32]>]
или &[AsRef<[f64]>]
. Внутренние ссылки ( AsRef<[f32]>
или AsRef<[f64]>
) удерживают значения выборки для одного канала каждый.
Поскольку нормальные векторы реализуют признак AsRef
, Vec<Vec<f32>>
и Vec<Vec<f64>>
может использоваться как для ввода, так и для вывода.
Асинхронные переосмысления доступны с фильтрами с анти-алиатами и без него.
Повторная выборка с анти-алиатами основана на интерполяции с ограниченной полосой с использованием интерполяционных фильтров SINC. Впрыскивание интерполяции SINC с помощью регулируемого фактора, а затем новые точки выборки рассчитываются путем интерполяции между этими точками. Коэффициент повторной выборки может быть обновлен в любое время.
Повторная выборка без склонность к альцу пропускает интерполяцию SINC с тяжелой процессором. Это работает намного быстрее, но дает более низкий качественный результат.
Синхронная повторная выборка реализуется через FFT. Данные являются FFT: ED, модифицированный спектр, а затем обратный FFT: ED, чтобы получить повторные данные. Этот тип повторного сфера значительно быстрее, но не поддерживает изменение коэффициента повторной выборки.
Резейтлеры, предоставленные этой библиотекой, предназначены для обработки звука в кусочках. Оптимальный размер куски определяется применением, но, вероятно, в конечном итоге окажется от нескольких сотен до нескольких тысяч кадров. Это дает хороший компромисс между эффективностью и использованием памяти.
Рубато подходит для приложений в реальном времени при использовании метода Resampler::process_into_buffer()
. Это хранит выход в предварительно выделенном выходном буфере и не выполняет распределения или другие операции, которые могут блокировать поток.
Предлагаемый простой процесс для повторной выборки аудиоклипа с известной длиной до новой скорости дискретизации выглядит следующим образом. Здесь предполагается, что исходные данные хранятся в VEC, или в какой -то другой структуре, которая поддерживает чтение произвольного количества кадров за раз. Для простоты вывод хранится во временном буфере во время повторной выборки, а затем копируется в пункт назначения.
Подготовка:
Resampler::output_delay()
чтобы узнать, сколько кадров задержки дает Resampler. Храните номер как delay
.new_length = original_length * new_rate / original_rate
.Теперь пришло время обработать основную часть клипа с помощью повторяющихся звонков. Петля:
Resampler::input_frames_next()
чтобы узнать, сколько кадров необходимо Resampler.Resampler::process()
или Resampler::process_into_buffer()
.Следующим шагом является обработка последних оставшихся кадров.
Resampler::process_partial()
или Resampler::process_partial_into_buffer()
. На этом этапе все кадры были отправлены в Resampler, но из -за задержки через Resampler у него все еще могут быть некоторые кадры во внутренних буферах. Когда все разыскиваемые кадры были сгенерированы, длина временного выходного буфера должна быть как минимум new_length + delay
. Если это не так, вызовите Resampler::process_partial()
или Resampler::process_partial_into_buffer()
без None
в качестве ввода и добавьте выход во временный выходной буфер. При необходимости повторите, пока длина не станет достаточной.
Наконец, скопируйте данные из временного выходного буфера в желаемое место назначения. Пропустите первые рамки delay
и скопируйте рамки new_length
.
Если есть более одного клипа для повторного разбора и по тем же показателям дискретизации, один и тот же переизмплер должен быть повторно использован. Создание нового повторного сфера является дорогой задачей, и его следует избегать, если это возможно. Начните процедуру с самого начала, но вместо того, чтобы создать новый Resampler, вызовите Resampler::reset()
на существующем, чтобы подготовить его к новой работе.
При переосмыслении потока процесс обычно выполняется в режиме реального времени, и либо вход вывода является некоторым API, который предоставляет или потребляет кадры с заданной скоростью.
AUDIO API, такие как CoreAudio на MacOS или межплатформу CPAL Crate, часто используют функции обратного вызова для обмена данными.
Полный
При захвате звука из них приложение передает функцию API аудио. Затем API периодически вызывает эту функцию с указанием на буфер данных, содержащий новые аудиокадры. Размер буфера данных обычно одинаков на каждом вызове, но это варьируется от API. Важно, чтобы функция не блокировала, поскольку это блокировало бы некоторую внутреннюю цикл API и вызвал потерю некоторых аудиоданных. Рекомендуется сохранить свет функции обратного вызова. В идеале он должен прочитать предоставленные аудиодатики из буфера, предоставленного API, и, необязательно выполнять некоторую обработку света, такую как преобразование формата образца. Никакая тяжелая обработка, такая как повторная выборка, должна быть выполнена здесь. Затем он должен хранить аудиоданные в общий буфер. Буфер может быть Arc<Mutex<VecDeque<T>>>
, или что -то более продвинутое, такое как Ringbuf.
Отдельный цикл, работающий либо в основном, либо в отдельном потоке, должен затем читать из этого буфера, повторно и сохранить в файл. Если аудио API обеспечивает фиксированный размер буфера, то это количество кадров является хорошим выбором для размера Chunk Resampler. Если размер варьируется, общий буфер может использоваться для адаптации размеров кусок аудио API и Resampler. Хорошей отправной точкой для размера resampler Chunk является использование «простого» значения вблизи среднего размера куски аудио API. Убедитесь, что общий буфер достаточно велик, чтобы не стать полным в случае, если цикл заблокирован, например, в ожидании доступа к диску.
Цикл должен следовать процессу, подобному повторной дискретизации клипа, но вход теперь является общим буфером. Цикл должен ждать, пока необходимое количество кадров станет доступным в буфере, прежде чем читать и передавать их в Resampler.
Также было бы целесообразно пропустить временный выходной буфер и написать выход непосредственно в пункт назначения. Hound Crate - популярный выбор для чтения и написания несжатых звуковых форматов.
Асинхронный переосмысл поддерживает SIMD на x86_64 и на Aarch64. Возможности SIMD ЦП определяются во время выполнения. Если не поддерживается набор инструкций SIMD, он возвращается к скалярной реализации.
На x86_64 он попытается использовать AVX. Если AVX недоступен, он вместо этого попробует SSE3.
На Aarch64 (64-битная рука) он будет использовать Neon, если таковые имеются.
Синхронные переосмысления получают выгоду от поддержки SIMD библиотеки Rustfft.
fft_resampler
: Включить синхронные повторные переписки на основе FFTЭта функция включена по умолчанию. Отключите его, если FFT Resamplers не нужны, чтобы сэкономить время компиляции и уменьшить полученный бинарный размер.
log
: включить журнал Эта функция позволяет регистрироваться через ящик log
. Это предназначено для целей отладки. Обратите внимание, что вывода журналов выделяет [std :: string :: string], а большинство реализаций журнала включают различные другие системы системных вызовов. Эти вызовы могут занять некоторое (непредсказуемое) время для возврата, в течение которого приложение заблокировано. Это означает, что регистрация следует избегать, если использует эту библиотеку в приложении в реальном времени.
Функция log
может быть включена при запуске тестов, что может быть очень полезно при отладке. Уровень ведения журнала может быть установлен через переменную среды RUST_LOG
.
Пример:
RUST_LOG=trace cargo test --features log
Повторите один кусок фиктивного аудиофайла с 44100 до 48000 Гц. См. Также пример «process_f64», который можно использовать для обработки файла с диска.
use rubato :: { Resampler , SincFixedIn , SincInterpolationType , SincInterpolationParameters , WindowFunction } ;
let params = SincInterpolationParameters {
sinc_len : 256 ,
f_cutoff : 0.95 ,
interpolation : SincInterpolationType :: Linear ,
oversampling_factor : 256 ,
window : WindowFunction :: BlackmanHarris2 ,
} ;
let mut resampler = SincFixedIn :: < f64 > :: new (
48000 as f64 / 44100 as f64 ,
2.0 ,
params ,
1024 ,
2 ,
) . unwrap ( ) ;
let waves_in = vec ! [ vec! [ 0.0f64 ; 1024 ] ; 2 ] ;
let waves_out = resampler . process ( & waves_in , None ) . unwrap ( ) ;
Справочник examples
содержит несколько образцов приложений для тестирования переосмысления. Существуют также сценарии Python для генерации простых тестовых сигналов, а также для анализа повторных результатов.
Примеры считывают и пишут необработанные аудиоданные в 64-разрядном формате плавания. Их можно использовать для обработки файлов .wav, если файлы сначала преобразованы в правильный формат. Используйте sox
, чтобы преобразовать .WAV в сырые образцы:
sox some_file.wav -e floating-point -b 64 some_file_f64.raw
После обработки результат может быть преобразован обратно в новый .wav. Эти примеры превращаются в 16-битные при 44,1 кГц:
sox -e floating-point -b 64 -r 44100 -c 2 resampler_output.raw -e signed-integer -b 16 some_file_resampled.wav
Многие аудио редакторы, например, Audacity, также могут напрямую импортировать и экспортировать необработанные образцы.
Крэт rubato
требует Rustc версии 1.61 или новее.
fft_resampler
.log
.input/output_buffer_allocate()
необязательно заполнить буферы с помощью нулей.Лицензия: MIT