התגברות על Timeouts בתמלול AI לאפליקציות מובייל
משתמש מעלה הקלטה של פגישה באורך 40 דקות—ומחכה לטקסט. אם קובץ MP4 גולמי של 300 MB נשלח לשרת ו-JSON חוזר 90 שניות מאוחר יותר, חוויית המשתמש נשברת לפני שהמילה הראשונה אפילו מופיעה. אנו בונים pipelines שבהם לקוח הנייד לא רק שולח את הקובץ אלא משתתף בהכנת הנתונים: חיתוך, המרה, חלוקה ל-chunks—ומקבל את התוצאה בהדרגה בזמן שהמודל עדיין מעבד. אנו מתמחים באינטגרציית תמלול AI מקצה לקצה, תוך התחשבות במאפייני הפלטפורמה ומגבלות ה-API. עם ניסיון של למעלה מ-5 שנים בפיתוח מובייל ו-15+ pipelines תמלול מיושמים ל-iOS ואנדרואיד, בסך הכל יותר מ-10,000 שעות אודיו שעובדו.
הטעות הנפוצה ביותר היא שליחת הקובץ כולו דרך URLSession.dataTask או OkHttp עם timeouts ברירת מחדל. עבור קבצים מעל 50 MB, זה מוביל ל-NSURLErrorTimedOut (iOS) או SocketTimeoutException (אנדרואיד) ב-70% מהמקרים. שרתים לעיתים קרובות מגיבים עם 413 Entity Too Large אם המגבלה לא מתואמת. במכשירים עם 2 GB RAM, ביצוע buffering של הקובץ כולו בזיכרון גורם ל-OOM—במיוחד עם וידאו.
למה VAD קריטי לדיוק?
חלוקה ל-chunks כל 60 שניות ללא התחשבות בהפסקות חותכת מילים באמצע—תמלול מפצל "תמלול" ל-"תמ" ו-"לול". זיהוי פעילות קולית (VAD) חותך בהפסקות אמיתיות: ב-iOS אנו משתמשים ב-AVAudioEngine עם סף של -45 dBFS, ב-Flutter בחבילת voice_activity_detector (WebRTC VAD). זה משפר את דיוק הזיהוי ב-15–20% לדיבור לא פורמלי בהשוואה לחלוקה אחידה.
הגדרות VAD אופייניות:
| פרמטר | ערך מומלץ | הערה |
|---|---|---|
min_speech_duration |
0.8 שניות | לפחות 0.5 שניות למשפטים קצרים |
min_silence_duration |
1.2 שניות | הגדל ל-2 שניות לראיונות |
threshold |
-45 dBFS | להקלטות שקטות השתמש ב--35 dBFS |
frame_size |
30 אלפיות השנייה | 10–30 אלפיות השנייה לפי WebRTC |
איך לכוון VAD לנתונים שלך
- הקלט דגימת דיבור של 10 דקות במכשיר היעד.
- הרץ אותה דרך VAD עם פרמטרי ברירת מחדל והמחש את גבולות ה-chunks.
- כוונן את
min_speech_durationו-thresholdכך שה-chunks לא יחתכו התחלות/סיומים של משפטים. - בדוק על מספר קבצים עם עוצמות קול ורעשי רקע משתנים.
איך להמיר Codecs ללא אובדן?
Whisper API מקבל audio/wav, mp3, mp4, ogg, אבל לא את כל ה-codecs בפנים. .mov עם pcm_s16le בסדר, עם ac3 נותן 400 Bad Request. ב-iOS AVAssetExportSession עם preset AVAssetExportPresetAppleM4A מכסה 95% מהפורמטים. באנדרואיד—MediaExtractor + MediaCodec (PCM) → MediaMuxer (AAC). עבור codecs אקזוטיים אנו מוסיפים FFmpeg (mobile-ffmpeg-full-gpl באנדרואיד, ffmpegkit ב-iOS).
מידע נוסף על המרת codec
אם כלים סטנדרטיים נכשלים, נעשה שימוש ב-FFmpeg עם הגדרות: `-acodec pcm_s16le -ar 16000 -ac 1` עבור Mono WAV, שמובטח שיתקבל על ידי כל ה-APIs.איך ה-Pipeline עובד בפועל
הכנת קבצים במכשיר
// iOS: Извлечь аудиодорожку из видео
let asset = AVURLAsset(url: videoURL)
let exportSession = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetAppleM4A)!
exportSession.outputFileType = .m4a
exportSession.outputURL = tempAudioURL
await exportSession.export()לאחר ייצוא—חלוקה ל-chunks של 25 MB (מגבלת Whisper API) באמצעות גבולות VAD. כל chunk מועלה דרך // iOS: Извлечь аудиодорожку из видео let asset = AVURLAsset(url: videoURL) let exportSession = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetAppleM4A)! exportSession.outputFileType = .m4a exportSession.outputURL = tempAudioURL await exportSession.export() עם תצורת רקע (URLSession.uploadTask(with:fromFile:)) כך שההעלאה נמשכת גם כשהאפליקציה ממוזערת.
באנדרואיד באופן דומה: URLSessionConfiguration.background עם WorkManager לעיבוד רקע, CoroutineWorker עם OkHttp דרך RequestBody.create, לא File—קריטי לחיסכון בזיכרון במכשירים עם 2 GB RAM.
הזרמת תוצאות
במקום polling כל N שניות—WebSocket או SSE. אם משתמשים בשרת עצמי על גבי Whisper, השרת יכול להזרים ByteArray כשה-chunks מעובדים. בצד הלקוח זה partial_transcript (iOS) או OkHttp URLSessionWebSocketTask (אנדרואיד), שמוסיפים שורות ל-WebSocket / StateFlow—ה-UI מתעדכן בזמן אמת.
לאינטגרציה ישירה עם OpenAI Whisper API אין streaming—ה-API הוא סינכרוני. אז עבור קבצים גדולים, חלק לבקשות עצמאיות ומיזג תוצאות בצד הלקוח לפי אינדקס chunk, לא לפי סדר התגובה (הרשת לא מבטיחה סדר).
אחסון ועיבוד לאחר
תמלול Whisper גולמי מחזיר @Published עם חותמות זמן—יקר יותר מטקסט בלבד. אחסן JSON עם segments, start, end עבור כל segment: זה מאפשר "הקשה על מילה → הרצת אודיו אחורה".
לעיבוד לאחר—פיסוק ו-diarization (מי אמר מה). Whisper לא מפריד דוברים. זה דורש שלב נפרד: text דרך API או AssemblyAI עם pyannote.audio. בצד הלקוח פשוט מיזג שני JSONs לפי חותמות זמן.
השוואת ספקים
| ספק | דיוק (רו) | Streaming | Diarization | מגבלת קבצים |
|---|---|---|---|---|
| OpenAI Whisper | גבוה | לא | לא | 25 MB |
| AssemblyAI | בינוני | כן | כן | 5 GB |
| Deepgram Nova-2 | גבוה | כן | כן | ללא הגבלה |
| Google Speech-to-Text v2 | בינוני | כן | כן | 1 GB |
| On-device (iOS CoreML) | בינוני | לא | לא | תלוי RAM |
לרוסית, Whisper large-v3 מספק דיוק גבוה ב-30% מ-Google Speech-to-Text, במיוחד בדיבור לא פורמלי וז'רגון טכני. Deepgram Nova-2 עם speaker_labels: true היא אפשרות טובה אם נדרש זמן אמת. ניתן להפחית עלויות תמלול בעד 40% על ידי בחירת הספק הנכון.
תיעוד OpenAI Whisper
מה כלול
- ביקורת פורמט—קביעת גודל קובץ ממוצע, codecs, שפה, דרישות diarization.
- בחירת ספק וארכיטקטורה—המלצה על מודל (Whisper, Deepgram, AssemblyAI) ואסטרטגיית העלאה.
- פיתוח Pipeline—הכנת קבצים, חלוקה ל-chunks, העלאת רקע, הזרמת תוצאות.
- אינטגרציית עיבוד לאחר—פיסוק, diarization, סנכרון UI.
- בדיקות על מכשירים אמיתיים—כולל CoreML ו-MediaCodec.
- תיעוד—תיאור API, דיאגרמות זרימת נתונים, הוראות שינוי.
- תמיכה לאחר מסירה—הגדרת ניטור, תיקוני באגים, ייעוץ.
תהליך עבודה
אנו מתחילים בביקורת: פורמט קובץ, גודל ממוצע, שפות, צורך ב-diarization, דרישות offline. על סמך זה אנו בוחרים את הספק וארכיטקטורת ה-pipeline.
הפיתוח מתקדם בשלבים: תחילה העלאה בסיסית + תמלול ללא אופטימיזציות, לאחר מכן הוספת חלוקה ל-chunks, העלאת רקע, הזרמת UI, עיבוד לאחר. כל שלב הוא branch נפרד עם בדיקות פונקציונליות על מכשירים אמיתיים (לא סימולטורים—CoreML ו-MediaCodec מתנהגים אחרת בחומרה אמיתית).
ציר זמן מאינטגרציית Whisper API פשוטה ל-pipeline מלא עם diarization והעלאת רקע: 2 עד 6 שבועות תלוי בפלטפורמה ובדרישות. עלות האינטגרציה מוערכת בנפרד לאחר הביקורת.
צור קשר לביקורת של הקבצים שלך—זה לוקח לא יותר משעה. הזמן את האינטגרציה וקבל pipeline עובד בזמן הקצר ביותר.







