مكتبة تحويل معدل عينة الصوت لصدأ.
توفر هذه المكتبة عمليات إعادة تشكيل لمعالجة الصوت في قطع.
النسبة بين معدلات عينة المدخلات والإخراج مجانية تمامًا. تتوفر التطبيقات التي تقبل إدخال الطول الثابت أثناء إرجاع إخراج الطول المتغير ، والعكس بالعكس.
يمكن استخدام Rubato في تطبيقات الوقت الفعلي دون أي تخصيص أثناء المعالجة عن طريق التخلص من [Resampler] واستخدام أساليب input_buffer_allocate و output_buffer_allocate قبل البدء في المعالجة. يجب تعطيل ميزة السجل للاستخدام الحقيقي (يتم تعطيله افتراضيًا).
يتم تخزين بيانات الإدخال والإخراج بتنسيق غير متداخل.
يتم تخزين بيانات الإدخال والإخراج كشرائح من المراجع ، &[AsRef<[f32]>]
أو &[AsRef<[f64]>]
. المراجع الداخلية ( AsRef<[f32]>
أو AsRef<[f64]>
) تحمل قيم العينة لقناة واحدة لكل منهما.
نظرًا لأن المتجهات العادية تنفذ سمة AsRef
، يمكن استخدام Vec<Vec<f32>>
و Vec<Vec<f64>>
لكل من الإدخال والمخرجات.
تتوفر عمليات إعادة تشكيل غير متزامنة مع وبدون مرشحات مضادة للتخليص.
يعتمد إعادة التشكيل مع مضادات التخزين على الاستيفاء المحدودة النطاق باستخدام مرشحات الاستيفاء SINC. تنصح الاستيفاء SINC من خلال عامل قابل للتعديل ، ثم يتم حساب نقاط العينة الجديدة عن طريق الاستيفاء بين هذه النقاط. يمكن تحديث نسبة إعادة التشكيل في أي وقت.
إن إعادة تشكيل بدون مضادات التمييز يحذف الاستيفاء في وحدة المعالجة المركزية. هذا يعمل بشكل أسرع بكثير ولكنه ينتج نتيجة جودة أقل.
يتم تنفيذ إعادة تشكيل متزامنة عبر FFT. البيانات هي FFT: ED ، المعدل الطيف ، ثم عكسي FFT: ED للحصول على البيانات المعاد تشكيلها. هذا النوع من Resampler أسرع بكثير ولكنه لا يدعم تغيير نسبة إعادة العينات.
تهدف عمليات إعادة التشكيل التي توفرها هذه المكتبة إلى معالجة الصوت في قطع. يتم تحديد حجم الجزء الأمثل من خلال التطبيق ، ولكن من المحتمل أن ينتهي به المطاف إلى حد ما بين بضع مئات إلى بضعة آلاف من الإطارات. هذا يعطي حل وسط جيد بين الكفاءة واستخدام الذاكرة.
Rubato مناسب للتطبيقات في الوقت الفعلي عند استخدام طريقة Resampler::process_into_buffer()
. هذا يخزن الإخراج في المخزن المؤقت للإخراج المسبق مسبقًا ، ولا يؤدي أي مخصصات أو عمليات أخرى قد تمنع الخيط.
هناك عملية بسيطة مقترحة لإعادة تشكيل مقطع صوتي بطول معروف إلى معدل عينة جديد على النحو التالي. من المفترض هنا أن يتم تخزين بيانات المصدر في VEC ، أو بنية أخرى تدعم قراءة عدد إطارات تعسفي في وقت واحد. من أجل البساطة ، يتم تخزين الإخراج في مخزن مؤقت مؤقت أثناء إعادة العينات ، ونسخه إلى الوجهة بعد ذلك.
الاستعدادات:
Resampler::output_delay()
لمعرفة عدد إطارات التأخير التي يعطيها إعادة التثبيت. تخزين الرقم على أنه 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 التي توفر أو تستهلك الإطارات بمعدل معين.
واجهات برمجة التطبيقات الصوتية مثل coreaudio على MacOS ، أو Cross Platform Cpal Crate ، غالبًا ما تستخدم وظائف رد الاتصال لتبادل البيانات.
كاملة
عند التقاط الصوت من هذه ، يمرر التطبيق وظيفة إلى واجهة برمجة تطبيقات الصوت. ثم يستدعي واجهة برمجة تطبيقات هذه الوظيفة بشكل دوري ، مع مؤشر إلى مخزن مؤقت للبيانات يحتوي على إطارات صوتية جديدة. عادة ما يكون حجم المخزن المؤقت للبيانات هو نفسه في كل مكالمة ، ولكن هذا يختلف بين واجهات برمجة التطبيقات. من المهم ألا تمنع الوظيفة ، لأن هذا من شأنه أن يمنع بعض الحلقة الداخلية من واجهة برمجة التطبيقات وتسبب فقدان بعض بيانات الصوت. يوصى بالحفاظ على ضوء وظيفة رد الاتصال. من الناحية المثالية ، يجب أن تقرأ بيانات الصوت المقدمة من المخزن المؤقت الذي توفره واجهة برمجة التطبيقات ، وإجراء بعض معالجة الضوء اختياريًا مثل تحويل تنسيق العينة. لا ينبغي إجراء المعالجة الثقيلة مثل إعادة العينات هنا. يجب بعد ذلك تخزين بيانات الصوت إلى مخزن مؤقت مشترك. قد يكون المخزن المؤقت Arc<Mutex<VecDeque<T>>>
، أو شيء أكثر تقدماً مثل RingBuf.
يجب أن تقرأ حلقة منفصلة ، تعمل إما في مؤشر ترابط رئيسي أو منفصل ، بعد ذلك من هذا المخزن المؤقت ، وإعادة النماذج ، وحفظها. إذا توفر API Audio حجمًا مؤقتًا ، فإن هذا العدد من الإطارات هو خيار جيد لحجم قطعة Resampler. إذا كان الحجم يختلف ، فيمكن استخدام المخزن المؤقت المشترك لتكييف أحجام القطع في API الصوتي وإعادة التشغيل. تتمثل نقطة انطلاق جيدة في حجم قطعة Resampler في استخدام قيمة "سهلة" بالقرب من متوسط حجم الجزء من API الصوتي. تأكد من أن المخزن المؤقت المشترك كبير بما يكفي لعدم امتلاءه في حالة حظر الحلقة في انتظار الوصول إلى القرص.
يجب أن تتبع الحلقة عملية مشابهة لإعادة تشكيل مقطع ، لكن الإدخال هو الآن المخزن المؤقت المشترك. تحتاج الحلقة إلى انتظار عدد الإطارات المطلوبة في المخزن المؤقت ، قبل قراءتها ونقلها إلى Resampler.
سيكون من المناسب أيضًا حذف المخزن المؤقت للإخراج المؤقت ، وكتابة الإخراج مباشرة إلى الوجهة. يعد Hound Crate خيارًا شائعًا لقراءة وكتابة تنسيقات صوتية غير مضغوطة.
يدعم Resampler غير المتزامن SIMD على x86_64 وعلى AARCH64. يتم تحديد قدرات SIMD في وحدة المعالجة المركزية في وقت التشغيل. إذا لم تتوفر مجموعة تعليمات SIMD المدعومة ، فإنها تعود إلى تطبيق العددية.
على x86_64 ، سيحاول استخدام AVX. إذا لم يكن AVX متاحًا ، فسيحاول بدلاً من ذلك SSE3.
على AARCH64 (ذراع 64 بت) ، سوف يستخدم النيون إذا كان متاحًا.
تستفيد عمليات إعادة التماثيل المتزامنة من دعم SIMD لمكتبة Rustfft.
fft_resampler
: تمكين عمليات إعادة التزامن المستند إلى FFTيتم تمكين هذه الميزة بشكل افتراضي. قم بتعطيله إذا لم تكن هناك حاجة إلى عمليات إعادة تشكيل FFT ، لتوفير وقت الترجمة وتقليل الحجم الثنائي الناتج.
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
لتحويل A .wav إلى عينات RAW:
sox some_file.wav -e floating-point -b 64 some_file_f64.raw
بعد المعالجة ، يمكن تحويل النتيجة مرة أخرى إلى New .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
يمكن للعديد من محرري الصوت ، على سبيل المثال ، الجرأة ، أيضًا استيراد العينات الأولية وتصديرها مباشرة.
يتطلب قفص rubato
Rustc الإصدار 1.61 أو الأحدث.
fft_resampler
.log
.input/output_buffer_allocate()
اختياريا قبل ملء المخازن المؤقتة مع الأصفار.الترخيص: معهد ماساتشوستس للتكنولوجيا