הודעות קוליות הן התכונה התובענית ביותר מבחינה טכנית מבין מדיה בצ'אט. הקלטה, קידוד, העלאה, השמעה עם ויזואליזציה של גל צליל, השמעה מואצת — כל שלב דורש טיפול מדויק ב-API האודיו של הפלטפורמה. בממוצע, אנו חוסכים לך עד 40 שעות של פיתוח פנימי, ותקציב היישום מחושב באופן אישי. הגישה שלנו, המבוססת על AAC, דוחסת אודיו פי 10 טוב יותר מ-WAV תוך שמירה על בהירות דיבור. קבלת ויזואליזציה חלקה של גל צליל ללא פיגור ומעבר נכון של סשן אודיו במהלך סיבוב מסך היא מאתגרת במיוחד. הניסיון שלנו עם 30+ פרויקטים מראה שללא גישה שיטתית, נתקלים בקלות בקונפליקטים של סשן, קבצים פגומים או פערי UX. אנו מיישמים הודעות קוליות במפתח מלא: מתכנון צינור האודיו ועד בדיקות על מכשירים אמיתיים. קבל הערכה של הפרויקט שלך — צור קשר עם המהנדסים שלנו.
כיצד ליישם הודעות קוליות בצ'אט נייד?
-
הכן הרשאות: בקש גישה למיקרופון (
AVFormatIDKey: kAudioFormatMPEG4AAC AVSampleRateKey: 16000 // достаточно для речи AVNumberOfChannelsKey: 1 // моно AVEncoderAudioQualityKey: AVAudioQuality.mediumב-iOS,RECORD_AUDIOבאנדרואיד) עם הסבר ברור למשתמש. ב-iOS — דרךAVAudioSession.requestRecordPermission(), באנדרואיד — דרךActivityResultContracts.RequestPermission(). -
הגדר סשן אודיו: ב-iOS, הגדר קטגוריה
.recordאו.playAndRecordעם אפשרות.defaultToSpeaker. באנדרואיד, אתחלMediaRecorderעם סדר הקריאות הנכון. -
הקלט: ב-iOS —
AVAudioRecorderעם AAC, 16 קילו-הרץ, מונו. באנדרואיד —MediaRecorderעםAudioSource.MIC,OutputFormat.MPEG_4,AudioEncoder.AAC. -
ויזואליזציה של גל צליל: ב-iOS, קבל משרעת דרך
averagePower(forChannel:)וצייר באמצעותCAShapeLayerאו SwiftUI Canvas. באנדרואיד — דרךgetMaxAmplitude()ו-Viewמותאם אישית או Compose Canvas. - שלח: העלה את קובץ ה-M4A הדחוס לשרת דרך REST או GraphQL.
-
השמעה עם מטמון: הורד ושמור אל
Library/Caches(iOS) אוgetCacheDir()(אנדרואיד), השמע עם בקרת מהירות (1.5×, 2×) דרךAVPlayer.rateאוExoPlayer.setPlaybackParameters.
מדוע ויזואליזציה של גל צליל חשובה ל-UX
ויזואליזציה של גל צליל היא מה שמבדיל יישום טוב מיישום בינוני. המשתמש רואה שההקלטה מתבצעת, יכול להעריך את האורך והדינמיקה של ההודעה. ללא גל הצליל, ההודעה מרגישה עיוורת — לא ברור אם יש שתיקה או דיבור פעיל. אנו מציירים את גל הצליל בזמן אמת במהלך ההקלטה ובאופן סטטי עם סמן השמעה במהלך ההשמעה. ב-iOS, אנו מקבלים משרעת דרך AVAudioRecorder.averagePower(forChannel: 0) עם קריאות updateMeters() בטיימר כל 50–100 אלפיות השנייה. הערך הוא ב-dB מ--160 עד 0, מנורמל ל-0..1: pow(10, power / 20). צייר באמצעות CAShapeLayer או SwiftUI Canvas — האחרון קל יותר לאנימציה ללא setNeedsDisplay. באנדרואיד, MediaRecorder.getMaxAmplitude() מחזיר ערך 0–32767. אנו אוספים אותו למערך דרך Handler.postDelayed() ומציירים באמצעות Canvas.drawRect() ב-View מותאם אישית או דרך Compose Canvas.
הקלטת אודיו: iOS לעומת אנדרואיד
| פרמטר | iOS (AVAudioRecorder) | אנדרואיד (MediaRecorder) |
|---|---|---|
| פורמט | AAC (MPEG4AAC) | AAC (MPEG_4) |
| קצב דגימה | 16000 הרץ | 16000 הרץ |
| ערוצים | מונו | מונו |
| איכות | בינונית | (ברירת מחדל) |
| הרשאה | NSMicrophoneUsageDescription | RECORD_AUDIO (ActivityResultContracts) |
| סשן | AVAudioSession (.record/.playAndRecord) | טיפול בשגיאות prepare() |
iOS
פרמטרים אופטימליים:
AVFormatIDKey: kAudioFormatMPEG4AAC
AVSampleRateKey: 16000 // достаточно для речи
AVNumberOfChannelsKey: 1 // моно
AVEncoderAudioQualityKey: AVAudioQuality.mediumAAC מונו 16 קילו-הרץ נותן ~20–30 קילו-בייט לדקה — קומפקטי וניתן לפענוח באנדרואיד ובדפדפן. מיכל M4A (עבור AAC) נתמך באופן טבעי בשתי הפלטפורמות. יש לבקש הרשאת מיקרופון מראש דרך AVAudioSession.requestRecordPermission(), לא ברגע לחיצה על כפתור ההקלטה. אם המשתמש מסרב, Info.plist חייב להכיל NSMicrophoneUsageDescription עם הסבר ברור. נקודה חשובה עם AVAudioSession: לפני תחילת ההקלטה, הפעל את הסשן עם קטגוריה .record או .playAndRecord עם אפשרות .defaultToSpeaker. אם לא תבצע מעבר זה במפורש, ההקלטה עלולה להתנגש עם השמעת מוזיקה דרך AirPods. לפי התיעוד של אפל, יש גם לטפל בהפרעות (למשל, שיחת טלפון).
אנדרואיד
MediaRecorder עם AudioSource.MIC, OutputFormat.MPEG_4, AudioEncoder.AAC. באנדרואיד 10+, נדרשת הרשאת RECORD_AUDIO דרך ActivityResultContracts.RequestPermission(). MediaRecorder דורש סדר מדויק של קריאות: setAudioSource → setOutputFormat → setAudioEncoder → prepare → start — ערבוב הסדר פירושו IllegalStateException בזמן ריצה, לא בזמן קומפילציה.
כיצד להאיץ השמעה מבלי לאבד איכות?
השמעה מואצת (1.5×, 2×) מתבצעת דרך AVPlayer.rate = 1.5 ב-iOS ו-ExoPlayer.setPlaybackParameters(PlaybackParameters(1.5f)) באנדרואיד. שני ה-APIs פועלים ללא עיוותים על דיבור הודות לתיקון גובה צליל. הודעות קוליות הן בדרך כלל 5–60 שניות — זה 2–200 קילו-בייט ב-AAC. העלה כקובץ רגיל, אבל עם ניואנס אחד: ב-iOS, בעת השמעה מ-URL, יש להחזיר את AVAudioSession לקטגוריה .playback או .playAndRecord, אחרת הצליל יגיע לאפרכסת, לא לרמקול. מטמון בצד הלקוח הוא חובה. בקשת שרת שוב בכל השמעה היא UX גרוע. שמור אל Library/Caches (iOS) או getCacheDir() (אנדרואיד) עם מגבלה על גודל המטמון הכולל.
טעויות נפוצות
| טעות | תוצאה | פתרון |
|---|---|---|
| אי קריאה ל-stop() לפני העלאה | קובץ פגום | קרא ל-stop() + release() לפני קריאה |
| שימוש ב-AudioRecord במקום MediaRecorder | קבצים לא דחוסים ענקיים | השתמש ב-MediaRecorder עם AAC |
| אי מעבר סשן אודיו להשמעה | צליל באפרכסת | הגדר במפורש קטגוריה להשמעה |
עבור דחיסת קול, AAC מספק דחיסה פי 10 טובה יותר מ-WAV עם איכות כמעט בלתי ניתנת להבחנה עבור דיבור. OPUS יעיל אפילו יותר אך דורש ספרייה נוספת ב-iOS. אנו בוחרים ב-AAC בשל התמיכה הטבעית שלו.
מה כלול
- ניתוח ארכיטקטורת הצ'אט הנוכחית
- עיצוב צינור אודיו (הקלטה → קידוד → העלאה → מטמון → השמעה)
- שילוב הקלטה/השמעה עם ויזואליזציה של גל צליל
- הגדרת השמעה מואצת ואינדיקציית התקדמות
- בדיקות על מכשירים אמיתיים (iOS + אנדרואיד)
- מסירת תיעוד וקוד מקור
- תמיכה לאחר פריסה (שבועיים)
ציר זמן
יישום בסיסי (הקלטה, קידוד, העלאה, השמעה עם התקדמות) — 2–3 ימים. גל צליל בזמן אמת + גל צליל במהלך השמעה — תוספת של 1–2 ימים. העלות מחושבת באופן אישי. קבל ייעוץ על שילוב הודעות קוליות — המהנדסים שלנו יעזרו להעריך את היקף העבודה.







