تتوقع النماذج على طراز Whisper صوتًا بتردد 16 كيلوهرتز. وتعمل معظم أجهزة الصوت في Mac بتردد 48 كيلوهرتز. في مكان ما بين الاثنين، لا بد من إجراء تحويل لمعدل العيّنة، وإذا حدث ذلك دون مرشّح فإنه يُدخل إلى مُدخل النموذج طاقة لم يُنتجها صوتك أبدًا.
باختصار
- التقليل من عيّنات 48 كيلوهرتز إلى 16 كيلوهرتز دون مرشّح تمرير منخفض يطوي كل ما يتجاوز 8 كيلوهرتز عائدًا إلى نطاق الكلام.
- يطبّق التحويل محدود النطاق أولًا مرشّح تمرير منخفض عند 8 كيلوهرتز، ثم يقلّل العيّنات بنسبة 3 إلى 1.
- يطلب Voice Type من Core Audio تدفق إدخال بتردد 16 كيلوهرتز مباشرةً، لذلك يحدث التحويل عادةً في مشغّل الصوت لا في التطبيق.
- عندما يعجز جهاز عن تقديم 16 كيلوهرتز، يحوّل التطبيق باستخدام
AVAudioConverterفي نهاية سلسلة تهيئة كل دفعة.
النهج الساذج يفسد الأمور
التقليل البسيط من العيّنات، أي إسقاط عيّنتين من كل ثلاث، يُنتج تداخلًا طيفيًا (aliasing). يحمل الالتقاط بتردد 48 كيلوهرتز محتوى يصل إلى 24 كيلوهرتز. وكل ما يتجاوز 8 كيلوهرتز لا مكان له في تدفق بتردد 16 كيلوهرتز، فينعكس عائدًا إلى نطاق الكلام. فنغمة 10 كيلوهرتز تظهر عند 6 كيلوهرتز. ويسمع النموذج صوتًا لم يُصدره المتحدث قط.
تُحسَّن إعادة العيّنة الرخيصة من أجل السرعة لا من أجل إضعاف نطاق الإيقاف. لا بأس بذلك لنغمة رنين. أما في التعرف على الكلام فلا، لأن الفرق بين “s” و“f” و“th” يقع بالضبط في منطقة الترددات العالية التي يُفترض أن يحميها المرشّح.
إعادة العيّنة محدودة النطاق
يعني التحويل محدود النطاق: تطبيق مرشّح تمرير منخفض عند تردد نايكويست للمعدل المستهدف (8 كيلوهرتز لمخرج بتردد 16 كيلوهرتز)، ثم تقليل العيّنات. تُزال الترددات التي كانت ستسبب التداخل الطيفي قبل أن تنطوي.
المرشّح هو موضع الهندسة هنا. إن كان شديدًا أكثر من اللازم فقدتَ محتوى الترددات العالية الذي يميّز الحروف الاحتكاكية. وإن كان لطيفًا أكثر من اللازم تسلّل التداخل الطيفي.
أين يفعل Voice Type ذلك
ليس حيث تتوقع، وليس حيث قالت نسخة سابقة من هذه الصفحة.
لا يلتقط التطبيق الصوت بتردد 48 كيلوهرتز ثم يحوّله في النهاية. بل يطلب من Audio Queue للإدخال تدفقًا بتردد 16 كيلوهرتز منذ البداية، فيجري Core Audio تحويل المعدل في مسار الالتقاط قبل أن يرى التطبيق أي عيّنة. ويعمل كاشف نشاط الصوت والمجمّع والمتعرّف جميعًا بتردد 16 كيلوهرتز. لا توجد مرحلة 48 كيلوهرتز في المسار الحي.
وتبقى جهتان تجريان التحويل داخل التطبيق، لأن الطلب طلب وليس ضمانًا:
- إذا أبلغ الجهاز المحدد عن معدل غير 16 كيلوهرتز، فإن مُدخل كاشف نشاط الصوت يُحوَّل أولًا، لأن البوابة مبنية حول إطارات من 512 عيّنة بتردد 16 كيلوهرتز ولا شيء غير ذلك.
- تمر كل دفعة مُفرَّغة عبر سلسلة تهيئة تنتهي بإعادة عيّنة إلى 16 كيلوهرتز. وعندما يكون الالتقاط بتردد 16 كيلوهرتز أصلًا تكون هذه الخطوة بلا أثر. وعندما لا يكون كذلك يتولى
AVAudioConverterالأمر، ويُعامَل المحوِّل على أنه عديم الحالة في كل استدعاء كي لا يلتقط مقطع قصير آثار التهيئة المسبقة من المقطع السابق.
سلسلة التهيئة المحيطة بذلك، بالترتيب: إزالة إزاحة التيار المستمر (DC)، ثم تطبيق المرشّحات والتحكم في الجهارة، ثم إعادة العيّنة. التصفية قبل تغيير المعدل هي الترتيب الصحيح، لأن تردد القطع لمرشّح التمرير العالي يُحدَّد بالهرتز، ومعاملات المرشّح تعتمد على معدل العيّنة الذي يعمل به.
لماذا لا نسجّل بتردد 48 كيلوهرتز ونحوّل لاحقًا؟
يمكنك ذلك، وكثير من المسارات تفعله. إن طلب معدل النموذج في طبقة الالتقاط أرخص من ثلاث جهات: لا توجد مخازن مؤقتة أكبر بثلاثة أضعاف مما يلزم، ولا يحتاج كاشف نشاط الصوت إلى تحويل قبله في المسار الشائع، ويجري التحويل الذي يحدث مرة واحدة بواسطة مشغّل الصوت بدلًا من أن يكرره التطبيق.
المقايضة هي أنك تثق بمحوِّل Core Audio بدلًا من محوِّلك الخاص. وهي مقايضة نرضى بها. فمحوِّل معدل العيّنة على مستوى المشغّل شيفرة مُختبرة جيدًا، والبديل هو صيانة محوِّل خاص بنا لحل مشكلة حلّتها Apple بالفعل.
ماذا يعني هذا لك
لا شيء تقريبًا، وهذا هو المقصود. تحويل المعدل مشكلة صحة، وليس مقبض ضبط. فإذا أُنجز بشكل صحيح فهو غير مرئي، وإذا أُنجز بشكل خاطئ ظهر في نص يخطئ في الحروف الساكنة بشكل طفيف لا يصلحه أي حجم من النماذج.
إذا كنت تبني شيئًا مشابهًا: حوّل باستخدام محوِّل محدود النطاق، وافعل ذلك مرة واحدة، وافعله بعد مرشّحاتك لا قبلها.
ذو صلة: اكتشاف نشاط الصوت · نظرة عامة على التقنية
