Speech Recognition (ASR) — فناوری تشخیص خودکار گفتار که سیگنال صوتی را به دنبالهای متنی تبدیل میکند. سیستمهای مدرن از deep learning استفاده میکنند: انکودر (Conformer, Whisper, BiLSTM + CTC) طیفنگار صوتی را به دنبالهای از حالتهای پنهان تبدیل میکند، دکودر (CTC greedy decoding, Beam Search, Transformer decoder) متن را تشکیل میدهد. در برنامههای موبایل، Speech Recognition برای ورود صوتی، دستیارهای صوتی، روایت خودکار تماسها و قابلیتهای دسترسی برای افراد با محدودیتهای حرکتی استفاده میشود. به گزارش Google Cloud Speech-to-Text, 2025، ASR ابری در شرایط SNR > 15 dB به WER ۷پارصد در زبان انگلیسی و ۱۲پارصد در زبان روسی دست مییابد.
نکات کلیدی
Automatic Speech Recognition (ASR) — پاپایلاین: صوت → پیشپردازش (16 kHz mono، کاهش نویز، VAD — فعالیت گفتار) → استخراج ویژگی (MFCC، LogMel FilterBank) → مدل آکوستیک (شبکه عصبی: CTC / RNNT / Transducer) → مدل زبان (LM) → دکودینگ (متن). مدلهای مدرن end-to-end (Whisper، Google USM، Conformer CTC) مدل آکوستیک و زبان را در یک Transformer ترکیب میکنند که پاپایلاین را سادهتر و دقت را افزایش میدهد.
معماریهای ASR برای دستگاههای موبایل: CTC (Connectionist Temporal Classification) — سریع، بدون نیاز به همترازی صوت و متن، مورد استفاده در Vosk، Android native. RNNT (Recurrent Neural Network Transducer) — ASR جریانی، تاخیر کم (Google USM). Conformer — دورگین CNN + Transformer، بهترین دقت، اما سنگینتر: Whisper Medium (769M پارامتر) — 30–60x تاخیر. برای on-device CTC ترجیح داده میشود: مدلهای CTC Vosk 50–100 MB حافظه اشغال میکنند، latency 0.3–0.8x زمان واقعی.
متریکهای ASR: WER (Word Error Rate) — درصد کلمات جایگزینشده، حذفشده، درجشده نسبت به مرجع. Google Cloud ASR — 7% WER (EN)، 12% (RU). Vosk — 13% (RU)، 9% (EN). Whisper Small — 6% (EN)، 10% (RU). CER (Character Error Rate) — مشابه، در سطح نویسه. Real-Time Factor (RTF) — زمان پردازش / مدت صوت. RTF < 1 — سریعتر از زمان واقعی. RTF < 0.3 — ASR بلافاصله. برای ورود صوتی RTF < 1، برای روایت RTF < 3 لازم است.
| راهحل ASR | WER (EN) | WER (RU) | RTF | On-device |
|---|---|---|---|---|
| Google Cloud ASR | 7% | 12% | 0.3 | خیر |
| Android SpeechRecognizer | 8% | 13% | 0.5–1 | بله (مخلوط) |
| SFSpeechRecognizer | 7% | 12% | 0.3–0.8 | بله (از iOS 17) |
| Vosk (vosk-model-small-ru) | 9% | 13% | 0.3–0.8 | بله |
| Whisper Small | 6% | 10% | 2–6 | بله |
VAD (Voice Activity Detection) — تشخیص فعالیت گفتار، جداسازی گفتار از سکوت و نویز. WebRTC VAD — استاندارد برای ASRهای موبایل: فریمهای 30 میلیثانیه، سه حالت (0، 1، 2 — از محافظهکارانه تا پرگیر). VAD RTF را 1.5–3x کاهش میدهد (بخشهای غیرگفتاری را نادیده میگیرد). Silero VAD (MIT) — VAD مبتنی بر شبکه عصبی، دقیقتر از WebRTC (94% vs 85% ROC AUC)، 5–10 ms latency، TFLite و Core ML. برای ASR تولیدی از کاسکد VAD → ASR استفاده کنید: این تشخیصهای نادرست را کاهش و پردازش را سریعتر میکند.
Android SpeechRecognizer — کلاس داخلی Android SDK برای تشخیص گفتار. در دو حالت کار میکند: ابری (سرور Google) — دقت بالا، نیازمند اینترنت؛ on-device (از Android 10+) — مدل ASR جاسازی GBoard، 20+ زبان، WER 15–18%. SpeechRecognizer در حین گفتار نتایج میانی (partial results) و متن نهایی را بازمیگرداند. از طریق RecognizerIntent.EXTRA_LANGUAGE از 60+ زبان پشتیبانی میکند. برای ورود صوتی توصیه میشود — انتگراسیون سریع، رایگان.
API SpeechRecognizer: ایجاد از طریق SpeechRecognizer.createSpeechRecognizer(context). Intent با RecognizerIntent.ACTION_RECOGNIZE_SPEECH با extra: LANGUAGE_MODEL_FREE_FORM (متن آزاد) یا LANGUAGE_MODEL_WEB_SEARCH (پرسوجوهای جستجو). نتیجه از طریق RecognitionListener: onReadyForSpeech → onBeginningOfSpeech → onRmsChanged → onPartialResults → onResults. برای تشخیص متصل (حالت «همیشه گوش کردن») — recognizer را پس از onResults مجدداً راهاندازی کنید. برای صرفهجویی در باتری از onDeviceOnly = true استفاده کنید.
// تشخیص گفتار Android SpeechRecognizer
val recognizer = SpeechRecognizer.createSpeechRecognizer(context)
recognizer.setRecognitionListener(object : RecognitionListener {
override fun onResults(results: Bundle) {
val text = results
.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION)
?.firstOrNull() ?: ""
showResult(text)
}
override fun onPartialResults(partialResults: Bundle) {
val partial = partialResults
.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION)
?.firstOrNull() ?: ""
showPartial(partial)
}
})
val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply {
putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)
putExtra(RecognizerIntent.EXTRA_LANGUAGE, "ru-RU")
}
recognizer.startListening(intent)
On-device vs Cloud در Android: on-device بدون اینترنت کار میکند (Android 10+، Pixel 4+، Samsung S20+). ابر دقیقتر است (مدل Google Neural Network ASM)، اما تاخیر بیشتری دارد (300–800 ms با شبکه). برای ورود صوتی از حیبرید استفاده کنید: ابر با افت به on-device در صورت بدون شبکه. Android SpeechRecognizer به صورت خودکار حالت را بر اساس RecognizerIntent.EXTRA_PREFER_OFFLINE انتخاب میکند. برای حداکثر حریم خصوصی — onDeviceOnly = true تنظیم کنید (اما دقت 15–18% WER برای روسی).
SFSpeechRecognizer — چارچوب Apple برای تشخیص گفتار در iOS، macOS، watchOS. از iOS 10 موجود است. حالت on-device — از iOS 17 (مدل محلی، بدون اینترنت). از 60+ زبان پشتیبانی میکند. دقت: WER 7–12% (on-device — 12–15%). SFSpeechRecognizer از طریق Speech.framework موجود است — نیازی به SDK افزوده ندارد. درخواست مجوز از طریق SFSpeechRecognizer.requestAuthorization.
API SFSpeechRecognizer: SFSpeechRecognizer(locale: Locale(identifier: "ru_RU")) → SFSpeechAudioBufferRecognitionRequest (صوت زنده) یا SFSpeechURLRecognitionRequest (فایل صوتی). جریان از طریق recognitionTask(with:delegate:) با SFSpeechRecognitionTaskDelegate (didHypothesizeTranscription — میانی، didFinishRecognition — نهایی). حالت on-device: request.requiresOnDeviceRecognition = true. برای iOS 15+: request.shouldReportPartialResults = true (نتیجه جریانی با تاخیر کم).
let recognizer = SFSpeechRecognizer(locale: Locale(identifier: "ru_RU"))
guard recognizer.isAvailable else { return }
let request = SFSpeechAudioBufferRecognitionRequest()
request.requiresOnDeviceRecognition = true
request.shouldReportPartialResults = true
recognitionTask = recognizer.recognitionTask(with: request) { result, error in
if let result = result {
let text = result.bestTranscription.formattedString
let isFinal = result.isFinal
DispatchQueue.main.async {
textView.text = text
}
}
}
audioEngine.inputNode.installTap(config: bufferConfig) { buffer, _ in
request.append(buffer)
}
audioEngine.prepare()
try audioEngine.start()
SFSpeechRecognizer vs Android SpeechRecognizer: SFSpeechRecognizer جریان مادرزاده بدون راهاندازی مجدد دارد (Android نیازمند startListening مجدد است). On-device در iOS از iOS 17 موجود است (Android — از Android 10). هر دو نیازمند مجوز کاربر هستند (NSMicrophoneUsageDescription + NSSpeechRecognitionUsageDescription برای iOS، RECORD_AUDIO برای Android). SFSpeechRecognizer در زبان انگلیسی دقیقتر است (on-device)، Android SpeechRecognizer در زبان روسی دقیقتر است (ابر). برای iOS قبل از 17 on-device موجود نیست — اینترنت لازم است. برای iOS 17+ on-device WER 12–14% در روسی میدهد.
Vosk — کتخانه ASR منبعباز از Alpha Cephei برای تشخیص گفتار آفلاین. مبتنی بر Kaldi ASR toolkit + مدلهای CTC. از 20+ زبان پشتیبانی میکند: روسی، انگلیسی، آلمانی، فرانسوی، اسپانیایی، چینی، عربی. مدلها از 50 MB (small — 50 MB، ru) تا 1.2 GB (large — 1.2 GB، en). Vosk در Android (JNI)، iOS (C++ wrapper)، Linux، Windows، Raspberry Pi کار میکند. RTF: 0.3–0.8 در دستگاههای علمکرد. Vosk — بهترین انتخاب برای ASR آفلاین کامل.
API Vosk: VoskWaveformModelLoader (بارگیری مدل) → VoskWaveformRecognizer (ایجاد تشخیصگر) → recognizer.createGrammar(list) یا recognizer.getResult() / recognizer.getPartialResult(). پشتیبانی از دستورات (مجموعه محدود دستور) — GrammarRecogniser — RTF 0.1–0.3 میدهد (3x سریعتر). برای ورود صوتی از تشخیص آزاد (getResult) استفاده کنید. برای دستورات صوتی — GrammarRecogniser (99% دقت برای دستورات). Vosk همچنین تشخیص گوینده (تحلیل وکتوری صدا) را پشتیبانی میکند.
// Vosk آفلاین ASR
val model = VoskModel("model/vosk-model-small-ru-0.22")
model.load()
val recognizer = VoskRecognizer(model, 16000.0f)
recognizer.setWords(true)
audioRecord.startRecording()
while (isListening) {
val buffer = ByteArray(3200) // صوت 100 میلیثانیه
audioRecord.read(buffer, 0, buffer.size)
if (recognizer.acceptWaveform(buffer)) {
val result = recognizer.result // JSON
text += JSONObject(result).getString("text")
}
}
Vosk vs Cloud ASR: Vosk کاملاً آفلاین است — حریم خصوصی، صفر تاخیر، رایگان. ابر (Google، Yandex) در سناریوهای پیچیده (نویز، لهجه) دقیقتر است — WER 3–5% پایینتر. Vosk برای موارد زیر ایدال است: ورود صوتی بدون اینترنت، برنامههای accessibility، روایت تماسها (حریم خصوصی). Cloud ASR — برای دستیارهای صوتی که دقت از حریم خصوصی مهمتر است. توصیه: Vosk برای آفلاین، SFSpeechRecognizer (iOS) / SpeechRecognizer (Android) برای آنلاین — رویکردها را برای سناریوهای مختلف ترکیب کنید.
Whisper — مدل OpenAI برای تشخیص گفتار، آموزشدیده بر روی 680 000 ساعت صوت (چندزبانه، 99 زبان). در اندازههای: tiny (39M، 10% WER EN، 15% RU)، small (244M، 6% WER EN، 10% RU)، medium (769M، 4.5% WER EN، 8% RU) موجود است. Whisper از طریق Core ML (iOS، ANE) و TFLite (Android، GPU) بر روی دستگاههای موبایل کار میکند. Whisper tiny: RTF 4–10 روی CPU، RTF 0.5–2 روی GPU (Android). Whisper small: RTF 2–6 روی GPU. Whisper medium — RTF 8–15، تنها برای non-real-time.
Whisper روی iOS (Core ML): Apple MLX Whisper — پیادهسازی Whisper برای Core ML و MLX (Apple Neural Engine). Whisper tiny Core ML روی iPhone 15 Pro: RTF 0.3–0.8 (سریعتر از زمان واقعی!). Whisper small Core ML: RTF 1–3. Whisper Core ML از ANE روی A17 Pro (Neural Engine 35 TOPS) استفاده میکند. Hugging Face Transformers → خروجی به Core ML از طریق coremltools-whisper. برای جریان از WhisperStitcher (chunking + stitching) استفاده کنید. Whisper روی iOS — دقیقترین on-device ASR (6% WER EN، 10% RU).
// Whisper Core ML در iOS
import MLXWhisper
let model = try WhisperModel(from: "whisper-tiny")
let audio = try AudioUtils.loadAudio(url: audioURL)
let segments = try model.transcribe(audio: Audio, options: TranscribeOptions(
language: "ru",
wordTimestamps: true,
temperature: 0.0
))
for segment in segments {
print(segment.text) // متن نهایی با انگشتهای زمانی
}
Whisper vs Vosk: Whisper دقیقتر است (6% vs 9% WER EN)، از 99 زبان پشتیبانی میکند، شامل تشخیص زبان، علامتگذاری، تشخیص احساسات است. Whisper سنگینتر است (39M–769M vs 50M Vosk)، در زمان واقعی کندتر است (RTF 0.5–6 vs 0.3–0.8). Whisper tiny — از نظر سرعت قابل مقایسه با Vosk (RTF 0.5–2 GPU). Vosk سبکتر، سریعتر، برای جریان بلافاصله مناسبتر است. Whisper — برای روایت یکباره که دقت از سرعت مهمتر است. Vosk — برای ورود صوتی بلافاصله. برای متن نهایی از Whisper، برای تعاملی از Vosk استفاده کنید.
ورود متنی صوتی — عمومیترین کاربرد ASR: دکته پیامها، پرسوجوهای جستجو، یادداشتها. نیازمندی: RTF < 1 (زمان واقعی)، نتایج میانی (دیدن متن در حین گفتار). Android Gboard و iOS Keyboard دارای ASR جاسازی هستند (on-device، WER 12–18%). برای پیادهسازی سفارشی از Android SpeechRecognizer / SFSpeechRecognizer استفاده کنید. برای حداکثر دقت — Cloud ASR + Vosk fallback. برای ورود صوتی با 98% دقت در روسی — ترکیب Vosk (offline) + Yandex SpeechKit (online).
روایت تماسها و جلسات — ASR برای ایجاد خودکار ستونوگرافی. نیازمندی: بدون نیاز به تاخیر، WER < 10%، تشخیص گوینده (که گفتار میکند). Whisper Small (offline) + pyannote-audio (diarization) — پیشکه استاندارد برای روایت. در iOS — Whisper Core ML (RTF 1–3، WER 6–10%). در Android — Whisper TFLite (RTF 2–6، WER 8–12%) یا Google Cloud ASR + diarization. برای حریم خصوصی (تماسها به سرور نمیروند) — Whisper روی دستگاه. دقت diarization: 80–90% DER.
دستیارهای صوتی — Siri (SFSpeechRecognizer)، Google Assistant (Android SpeechRecognizer)، Alexa (on-device ASR). دستیار سفارشی: ASR → NLU (درک زبان طبیعی) → عمل → TTS. ASR — مرحله اول — دقت کل زنجیره را تعیین میکند. برای NLU از RASA، Snips NLU (on-device) یا Cloud NLU (Dialogflow، Amazon Lex) استفاده کنید. برای TTS: Android TTS / iOS AVSpeechSynthesizer. دستیار صوتی on-device (Vosk + RASA + TTS) — کاملاً خصوصی، بدون اینترنت کار میکند، تاخیر در پرسوجو کمتر از 2 ثانیه.
// دستیار صوتی با Android SpeechRecognizer + TTS
recognizer.setRecognitionListener(object : RecognitionListener {
override fun onResults(results: Bundle) {
val query = results.getStringArrayList(
SpeechRecognizer.RESULTS_RECOGNITION
)?.firstOrNull() ?: return
val intentResult = nluService.classify(query)
textToSpeech.speak(intentResult.response)
executeAction(intentResult.action)
}
})
Accessibility برای افراد با محدودیتهای حرکتی — Speech Recognition به شما امکان کنترل برنامه با صدا را میدهد: باز کردن مخاطبان، ارسال پیام، گیرفتن شماره. Android Voice Access و iOS Switch Control + VoiceOver — راهحلهای جاسازی. برای پیادهسازی سفارشی: GrammarRecogniser (Vosk) با مجموعه ثابت دستورات (50–100 عبارت) — RTF 0.1–0.3، 99% دقت. Vosk Grammar امکان تعریف دستور زبان در فرمت BNF را میدهد. برای accessibility سرعت حساس است — Vosk Grammar 5x سریعتر از تشخیص آزاد است و باتری کمتری مصرف میکند.
سوالات متداول
از noise suppression (WebRTC NS — ساختهشده در Android، iOS AVAudioSession) استفاده کنید. برای جداسازی بخشهای غیرگفتاری از VAD استفاده کنید. SNR را از طریق میکروفن با beamforming (ضبط دیرکشنده) یا آرایه چند میکروفونی افزایش دهید. Whisper در برابر نویز مقاومتر است (آموزش دیده بر روی 680K ساعت با نویز). Vosk با کاهش نویز از طریق WebRTC در نویز 50 dB +5% WER میدهد. برای تولید از آزمایش با شرایط نویز برنامه خود استفاده کنید.
بله، از iOS 17 SFSpeechRecognizer از حالت on-device پشتیبانی میکند (requiresOnDeviceRecognition = true). در iOS 16 و بالاتر on-device موجود نیست — برای Siri/Gboard ASR اینترنت لازم است. جایگزین: Vosk از طریق C++ wrapper (offline، WER 12–15%)، Whisper Core ML (offline، WER 6–10%، latency 2–6x). برای ورود صوتی در iOS 16- از Vosk استفاده کنید. Whisper Core ML — برای روایت فایلهای صوتی (غیر بلافاصله). همه راهحلها کاملاً خصوصی هستند و بدون اینترنت کار میکنند.
Android SpeechRecognizer از طریق RecognizerIntent.EXTRA_LANGUAGE از 60+ زبان پشتیبانی میکند. لیست کامل توسط Locale.getAvailableLocales() روی دستگاه تعیین میشود. روسی، انگلیسی، آلمانی، فرانسوی، اسپانیایی، ایتالیایی — همیشه موجود هستند. چینی، ژاپنی، کرهای — بستگی به مدل دارد. حالت on-device (Android 10+) — 20+ زبان. به طور متفاوت از Vosk (20 زبان) و SFSpeechRecognizer (60 زبان)، Android SpeechRecognizer به نسخه Google Play Services بستگی دارد.
از model adaptation استفاده کنید: Whisper fine-tuning بر روی 100+ ساعت صوت دومینه (Hugging Face Trainer). Vosk — جایگزینی مدل زبان (فرمت ARPA) با متن دومینه (100K+ جمله). Google Cloud ASR — phrase hints (کلمات دومینه، DL=0/1/2). SFSpeechRecognizer — SFSpeechRecognitionTaskDelegate با contextualStrings (ماتریس کلمات راهنما). Domain adaptation دقت را برای اصطلاحات خاص 15–30% WER افزایش میدهد. حداقل: 500 فایل صوتی دومینه با روایت.
WER = (S + D + I) / N، که در آن S — substitutions (جایگزینها)، D — deletions (حذفها)، I — insertions (درجها)، N — تعداد کلمات در متن مرجع. مثال: مرجع = «سلام چطوری»، پیشبینی = «سلام چه کاری» → S=1 (چطوری→کاری)، D=0، I=0 → WER = 1/2 = 50%. برای محاسبه از کتابخانه jiwer (Python) یا WER Calculator (JavaScript) استفاده کنید. CER — مشابه، در سطح نویسه. برای زبان روسی، CER به دلیل طول کلمات 20–30% از WER پایینتر است.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید