ביטול רעשי רקע באמצעות AI עבור אפליקציות שיחות ניידות
הבעיה: רעשי רקע בשיחות ניידות
כאשר אתה פותח את המיקרופון באמצעות AVAudioSession ב-iOS או AudioRecord באנדרואיד, אתה מקבל זרם PCM גולמי — עם כל מה שמסביב למשתמש. עבודות בנייה, מכונות קפה, ילדים — כל זה נכנס לשיחה. ביטול ההד האקוסטי הסטנדרטי (AEC) מ-WebRTC מסיר הד אך לא רעשי רקע. אנו מיישמים אינטגרציה מלאה של מודלים של דיכוי רעש מבוססי ML — החל מבחירת ארכיטקטורה ועד פרסום בחנויות האפליקציות. למהנדסים שלנו יש ניסיון של 5+ שנים בעיבוד שמע והם סיפקו למעלה מ-30 פרויקטים עם ממשקי קול.
כיצד דיכוי רעש מבוסס AI שונה מ-DSP סטנדרטי
גישות קלאסיות — חיסור ספקטרלי או פילטר וינר: מודל הרעש מוערך במהלך הפסקות דיבור, ולאחר מכן מוחסר מהספקטרום. זה עובד עבור רעש נייח (זמזום מאוורר), ונכשל על רעש לא נייח (פטפוט ברכבת התחתית, מקלדת קרובה).
גישת AI — רשת נוירונית שאומנה על זוגות של דיבור נקי + דיבור רועש חוזה מסכה עבור כל פריים ספקטרוגרפי. מודלים כמו RNNoise או DTLN פועלים בזמן אמת, מעבדים פריימים של 10–20 אלפיות השנייה עם השהיה תת-פריימית.
כיצד פועל ביטול רעשי רקע בזמן אמת באמצעות AI
מודל ה-ML מקבל את הספקטרוגרמה של האות, מחשב את ההסתברות לדיבור בכל פס תדר, ומפעיל פילטר. זה מאפשר דיכוי רעש גם בזמן שהאדם מדבר — בניגוד לגייטס. זיהוי פעילות קולית (VAD) מפחית עוד יותר את העומס על ידי העברת רק קטעי דיבור.
השוואת מודלים: RNNoise לעומת DTLN
| פרמטר | RNNoise | DTLN |
|---|---|---|
| גודל המודל | ~90 KB | ~2 MB |
| השהיה | <1 אלפית השנייה | 8–35 אלפיות השנייה (תלוי במכשיר) |
| איכות דיכוי | טוב לרעש נייח | מצוין לרעש מורכב ורב-רכיבי |
| תמיכה בפלטפורמות | ספריית C (iOS/Android דרך NDK) | TFLite (אנדרואיד) / Core ML (iOS) |
| המלצה | מכשירים תקציביים, מגבלות משאבים | מכשירי דגל, דרישות איכות גבוהות |
RNNoise: התחלה מהירה בשתי הפלטפורמות
RNNoise מ-Mozilla היא ספריית C, 90 KB, ~2 MFLOPS לפריים. היא מתקמפלת לספרייה סטטית עבור iOS (xcframework) ואנדרואיד (AAR עם חלק native דרך NDK).
// Инициализация
DenoiseState *st = rnnoise_create(NULL);
// Обработка фрейма (480 сэмплов = 10 мс при 48 kHz)
float frame[480];
// ... заполнить из буфера микрофона
float vad_prob = rnnoise_process_frame(st, frame, frame);
// frame теперь содержит очищенный сигнал
// vad_prob > 0.5 — вероятно речь
אינטגרציה ב-iOS: // Инициализация DenoiseState *st = rnnoise_create(NULL); // Обработка фрейма (480 сэмплов = 10 мс при 48 kHz) float frame[480]; // ... заполнить из буфера микрофона float vad_prob = rnnoise_process_frame(st, frame, frame); // frame теперь содержит очищенный сигнал // vad_prob > 0.5 — вероятно речь עם AVAudioEngine מותאם אישית או טאפ על צומת הקלט. פורמט — AVAudioSinkNode, 48 קילו-הרץ, מונו. יש להגדיר את AVAudioSession עם Float32 ולהשבית במפורש עיבוד מערכת, אחרת iOS מפעילה דיכוי רעש משלה בנוסף לשלך.
let inputNode = audioEngine.inputNode
let format = inputNode.outputFormat(forBus: 0)
inputNode.installTap(onBus: 0, bufferSize: 480, format: format) { [weak self] buffer, _ in
guard let self = self else { return }
let channelData = buffer.floatChannelData![0]
// Передаём в rnnoise_process_frame через C-bridge
self.rnnoiseProcessor.process(channelData, frameLength: Int(buffer.frameLength))
}באנדרואיד — mode: .voiceChat עם let inputNode = audioEngine.inputNode let format = inputNode.outputFormat(forBus: 0) inputNode.installTap(onBus: 0, bufferSize: 480, format: format) { [weak self] buffer, _ in guard let self = self else { return } let channelData = buffer.floatChannelData![0] // Передаём в rnnoise_process_frame через C-bridge self.rnnoiseProcessor.process(channelData, frameLength: Int(buffer.frameLength)) } , גודל באפר של 480 דגימות, עיבוד בתרדת נפרדת עם AudioRecord. קרא לאותה ספריית C דרך JNI.
DTLN ומודלים כבדים יותר
אם RNNoise אינו מספק (רעש מורכב ורב-רכיבי, מקורות מרובים), אנו משתמשים ב-DTLN — מודל LSTM דו-שלבי. הוא מומר ל-TFLite (אנדרואיד) או Core ML (iOS).
בפועל: DTLN ב-16 קילו-הרץ לוקח 8–14 אלפיות השנייה לפריים ב-iPhone 12, בהחלט בתוך זמן אמת. באנדרואיד Snapdragon 778G — דומה. ב-Helio G85 תקציבי — 25–35 אלפיות השנייה, מה שיוצר השהיה מצטברת.
לשימוש נייד, בחירת קצב הדגימה חשובה: 16 קילו-הרץ במקום 48 קילו-הרץ מפחית את העומס החישובי פי ארבעה, ולגבי דיבור, רוחב פס של עד 8 קילו-הרץ מספיק להבנה.
אינטגרציה לתוך WebRTC
SDK של WebRTC (LiveKit, Agora, Daily) מספקים AudioFormat.ENCODING_PCM_FLOAT או הוק לפני הקידוד. ב-WebRTC native עבור iOS — Process.THREAD_PRIORITY_URGENT_AUDIO מותאם אישית:
// Регистрируем кастомный процессинг
let config = RTCConfiguration()
// Создаём RTCPeerConnectionFactory с кастомным AudioDeviceModule
// или используем AudioProcessingConfig для WebRTC built-in замены
ניואנס חשוב: WebRTC כבר כולל AudioProcessingModule ו-RTCAudioProcessingModule (דיכוי רעש). בעת הפעלת דיכוי רעש AI משלך, עליך להשבית את // Регистрируем кастомный процессинг let config = RTCConfiguration() // Создаём RTCPeerConnectionFactory с кастомным AudioDeviceModule // или используем AudioProcessingConfig для WebRTC built-in замены המובנה דרך AECM, אחרת עיבוד כפול יוצר ארטיפקטים — צליל "מתכתי", עיצורים קטועים.
מה כלול בעבודה (תוצרים)
- ביקורת על צינור השמע הנוכחי באפליקציה
- בחירת מודל (RNNoise/DTLN/מותאם אישית) בהתאם לדרישות השהיה ואיכות
- קומפילציה של ספריות native עבור ארכיטקטורות יעד (arm64, x86_64 לסימולטור)
- אינטגרציה לתוך מחסנית השמע הקיימת (AVAudioEngine, AudioRecord, WebRTC)
- כוונון VAD וביטול עיבוד כפול (השבתת NS מובנה)
- בדיקות עם רעשים מהעולם האמיתי (רכבת תחתית, רחוב, משרד)
- תיעוד ותמיכה לפרסום בחנות האפליקציות
מלכודות נפוצות ביישום
- שכחת השבתת דיכוי רעש מובנה ב-WebRTC — גורם לצליל "מתכתי".
- שימוש ב-48 קילו-הרץ עבור DTLN — השהיה הופכת לבלתי מקובלת.
- אי הגדרת VAD — המודל מבזבז משאבים על שתיקה.
- אי בדיקת תאימות בין גרסאות אנדרואיד (ל-AudioRecord יש באגים בחלק מהקושחות).
לוחות זמנים משוערים
אינטגרציה של RNNoise לתוך מחסנית WebRTC קיימת: 1–2 שבועות. יישום מלא עם DTLN/TFLite, כוונון VAD ותמיכה דו-פלטפורמית: 3–5 שבועות. העלות מחושבת באופן אישי. צור קשר להערכת הפרויקט שלך — נמצא את הפתרון האופטימלי ונספק ייעוץ.







