Nhận dạng giọng nói — khái niệm, công nghệ và nguyên lý hoạt động

Tác giả: IT Sectr Đã đăng: 2026-07-19 Thời gian đọc: 10 phút

Nhận dạng giọng nói (ASR) là công nghệ nhận dạng giọng nói tự động chuyển đổi tín hiệu âm thanh thành chuỗi văn bản. Các hệ thống hiện đại sử dụng deep learning: bộ mã hóa (Conformer, Whisper, BiLSTM + CTC) chuyển đổi phổ âm thanh thành chuỗi trạng thái ẩn, bộ giải mã (CTC greedy decoding, Beam Search, Transformer decoder) tạo ra văn bản. Trong ứng dụng di động, Nhận dạng giọng nói được sử dụng cho nhập liệu bằng giọng nói, trợ lý giọng nói, phiên âm cuộc gọi tự động và các tính năng trợ năng cho người khuyết tật vận động. Theo Google Cloud Speech-to-Text, 2025, ASR đám mây đạt WER 7% cho tiếng Anh và 12% cho tiếng Nga ở SNR > 15 dB.

Những điểm chính

  • Nhận dạng giọng nói — chuyển đổi giọng nói thành văn bản (ASR) sử dụng mạng nơ-ron
  • Android SpeechRecognizer — ASR trên thiết bị + đám mây, 60+ ngôn ngữ, WER 7–12%
  • SFSpeechRecognizer — nhận dạng gốc iOS, trên thiết bị từ iOS 17
  • Vosk — ASR ngoại tuyến, 20+ ngôn ngữ, độ trễ 0.5–1.5x thời gian thực, WER 13% tiếng Nga
  • Whisper — ASR của OpenAI, trên thiết bị qua Core ML / TFLite, đa ngôn ngữ

Nhận dạng giọng nói là gì: nguyên lý ASR

Nhận dạng giọng nói tự động (ASR) là một pipeline: âm thanh → tiền xử lý (16 kHz mono, giảm nhiễu, VAD — phát hiện hoạt động giọng nói) → trích xuất đặc trưng (MFCC, LogMel FilterBank) → mô hình âm học (mạng nơ-ron: CTC / RNNT / Transducer) → mô hình ngôn ngữ (LM) → giải mã (văn bản). Các mô hình end-to-end hiện đại (Whisper, Google USM, Conformer CTC) kết hợp mô hình âm học và ngôn ngữ vào một Transformer duy nhất, đơn giản hóa pipeline và cải thiện độ chính xác.

Kiến trúc ASR cho thiết bị di động: CTC (Connectionist Temporal Classification) — nhanh, không yêu cầu căn chỉnh âm thanh-văn bản, được sử dụng trong Vosk và Android gốc. RNNT (Recurrent Neural Network Transducer) — ASR phát trực tiếp, độ trễ thấp (Google USM). Conformer — kết hợp CNN + Transformer, độ chính xác tốt nhất nhưng nặng hơn: Whisper Medium (769M tham số) — độ trễ 30–60x. Trên thiết bị, CTC được ưu tiên: mô hình CTC của Vosk chiếm 50–100 MB, độ trễ 0.3–0.8x thời gian thực.

Chỉ số ASR: WER (Word Error Rate) — tỷ lệ phần trăm từ bị thay thế, xóa và chèn so với tham chiếu. Google Cloud ASR — WER 7% (EN), 12% (RU). Vosk — 13% (RU), 9% (EN). Whisper Small — 6% (EN), 10% (RU). CER (Character Error Rate) — tương tự, ở cấp độ ký tự. Real-Time Factor (RTF) — thời gian xử lý / thời lượng âm thanh. RTF < 1 — nhanh hơn thời gian thực. RTF < 0.3 — ASR thời gian thực. Nhập liệu giọng nói yêu cầu RTF < 1, phiên âm yêu cầu RTF < 3.

Giải pháp ASRWER (EN)WER (RU)RTFTrên thiết bị
Google Cloud ASR7%12%0.3Không
Android SpeechRecognizer8%13%0.5–1Có (kết hợp)
SFSpeechRecognizer7%12%0.3–0.8Có (từ iOS 17)
Vosk (vosk-model-small-ru)9%13%0.3–0.8
Whisper Small6%10%2–6

VAD (Phát hiện hoạt động giọng nói) — phát hiện hoạt động giọng nói, tách lời nói khỏi im lặng và tiếng ồn. WebRTC VAD là tiêu chuẩn cho ASR di động: khung 30 ms, ba chế độ (0, 1, 2 — từ thận trọng đến tích cực). VAD giảm RTF 1.5–3x (bỏ qua các đoạn không phải lời nói). Silero VAD (MIT) là VAD nơ-ron, chính xác hơn WebRTC (94% so với 85% ROC AUC), độ trễ 5–10 ms, TFLite và Core ML. Đối với ASR sản xuất, hãy sử dụng tầng VAD → ASR: điều này giảm dương tính giả và tăng tốc xử lý.

Android SpeechRecognizer API

Android SpeechRecognizer là một lớp tích hợp trong SDK Android để nhận dạng giọng nói. Nó hoạt động ở hai chế độ: đám mây (máy chủ Google) — độ chính xác cao, yêu cầu internet; trên thiết bị (từ Android 10+) — mô hình ASR nhúng của GBoard, 20+ ngôn ngữ, WER 15–18%. SpeechRecognizer trả về kết quả trung gian (kết quả một phần) trong khi nói và văn bản cuối cùng. Hỗ trợ 60+ ngôn ngữ qua RecognizerIntent.EXTRA_LANGUAGE. Được khuyến nghị cho nhập liệu giọng nói — tích hợp nhanh, miễn phí.

API SpeechRecognizer: được tạo qua SpeechRecognizer.createSpeechRecognizer(context). Intent với RecognizerIntent.ACTION_RECOGNIZE_SPEECH với extras: LANGUAGE_MODEL_FREE_FORM (văn bản tự do) hoặc LANGUAGE_MODEL_WEB_SEARCH (truy vấn tìm kiếm). Kết quả qua RecognitionListener: onReadyForSpeech → onBeginningOfSpeech → onRmsChanged → onPartialResults → onResults. Để nhận dạng liên tục (chế độ luôn lắng nghe) — khởi động lại bộ nhận dạng sau onResults. Để tiết kiệm pin, hãy sử dụng onDeviceOnly = true.

kotlin
// 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)

Trên thiết bị so với Đám mây trên Android: trên thiết bị hoạt động không cần internet (Android 10+, Pixel 4+, Samsung S20+). Đám mây chính xác hơn (Google Neural Network ASM Model) nhưng có độ trễ cao hơn (300–800 ms bao gồm mạng). Đối với nhập liệu giọng nói, hãy sử dụng phương pháp kết hợp: đám mây với dự phòng trên thiết bị khi không có mạng. Android SpeechRecognizer tự động chọn chế độ dựa trên RecognizerIntent.EXTRA_PREFER_OFFLINE. Để bảo mật tối đa — đặt onDeviceOnly = true (nhưng độ chính xác là 15–18% WER cho tiếng Nga).

iOS SFSpeechRecognizer và Speech Framework

SFSpeechRecognizer là framework của Apple để nhận dạng giọng nói trên iOS, macOS và watchOS. Có sẵn từ iOS 10. Chế độ trên thiết bị — từ iOS 17 (mô hình cục bộ, không cần internet). Hỗ trợ 60+ ngôn ngữ. Độ chính xác: WER 7–12% (trên thiết bị — 12–15%). SFSpeechRecognizer có sẵn qua Speech.framework — không yêu cầu SDK bổ sung. Yêu cầu quyền qua SFSpeechRecognizer.requestAuthorization.

API SFSpeechRecognizer: SFSpeechRecognizer(locale: Locale(identifier: "ru_RU")) → SFSpeechAudioBufferRecognitionRequest (âm thanh trực tiếp) hoặc SFSpeechURLRecognitionRequest (tệp âm thanh). Phát trực tiếp qua recognitionTask(with:delegate:) với SFSpeechRecognitionTaskDelegate (didHypothesizeTranscription — một phần, didFinishRecognition — cuối cùng). Chế độ trên thiết bị: request.requiresOnDeviceRecognition = true. Đối với iOS 15+: request.shouldReportPartialResults = true (kết quả phát trực tiếp với độ trễ thấp).

swift
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 so với Android SpeechRecognizer: SFSpeechRecognizer có phát trực tiếp gốc mà không cần khởi động lại (Android yêu cầu startListening lặp lại). Trên thiết bị trên iOS có sẵn từ iOS 17 (Android từ Android 10). Cả hai đều yêu cầu quyền người dùng (NSMicrophoneUsageDescription + NSSpeechRecognitionUsageDescription cho iOS, RECORD_AUDIO cho Android). SFSpeechRecognizer chính xác hơn cho tiếng Anh (trên thiết bị), Android SpeechRecognizer chính xác hơn cho tiếng Nga (đám mây). Đối với iOS trước 17, trên thiết bị không khả dụng — yêu cầu internet. Đối với iOS 17+, trên thiết bị cho WER 12–14% cho tiếng Nga.

Vosk: nhận dạng ngoại tuyến 20+ ngôn ngữ

Vosk là thư viện ASR mã nguồn mở của Alpha Cephei để nhận dạng giọng nói ngoại tuyến. Dựa trên Kaldi ASR toolkit + mô hình CTC. Hỗ trợ 20+ ngôn ngữ: tiếng Nga, tiếng Anh, tiếng Đức, tiếng Pháp, tiếng Tây Ban Nha, tiếng Trung, tiếng Ả Rập. Mô hình từ 50 MB (nhỏ — 50 MB, ru) đến 1.2 GB (lớn — 1.2 GB, en). Vosk hoạt động trên Android (JNI), iOS (trình bao bọc C++), Linux, Windows, Raspberry Pi. RTF: 0.3–0.8 trên các thiết bị flagship. Vosk là lựa chọn tốt nhất cho ASR ngoại tuyến hoàn chỉnh.

API Vosk: VoskWaveformModelLoader (tải mô hình) → VoskWaveformRecognizer (tạo bộ nhận dạng) → recognizer.createGrammar(list) hoặc recognizer.getResult() / recognizer.getPartialResult(). Hỗ trợ ngữ pháp (tập lệnh cố định) — GrammarRecogniser — cho RTF 0.1–0.3 (nhanh hơn 3x). Đối với nhập liệu giọng nói, hãy sử dụng nhận dạng tự do (getResult). Đối với lệnh thoại — GrammarRecogniser (độ chính xác 99% trên lệnh). Vosk cũng hỗ trợ nhận dạng người nói (phân tích vectơ giọng nói).

kotlin
// Vosk offline 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) // 100ms audio
    audioRecord.read(buffer, 0, buffer.size)
    if (recognizer.acceptWaveform(buffer)) {
        val result = recognizer.result // JSON
        text += JSONObject(result).getString("text")
    }
}

Vosk so với ASR đám mây: Vosk hoàn toàn ngoại tuyến — quyền riêng tư, độ trễ bằng không, miễn phí. Đám mây (Google, Yandex) chính xác hơn trong các tình huống phức tạp (nhiễu, giọng) — WER thấp hơn 3–5%. Vosk lý tưởng cho: nhập liệu giọng nói không cần internet, ứng dụng trợ năng, phiên âm cuộc gọi (quyền riêng tư). ASR đám mây dành cho trợ lý giọng nói nơi độ chính xác quan trọng hơn quyền riêng tư. Khuyến nghị: Vosk cho ngoại tuyến, SFSpeechRecognizer (iOS) / SpeechRecognizer (Android) cho trực tuyến — kết hợp các phương pháp cho các tình huống khác nhau.

Whisper OpenAI trên thiết bị di động

Whisper là mô hình của OpenAI để nhận dạng giọng nói, được đào tạo trên 680.000 giờ âm thanh (đa ngôn ngữ, 99 ngôn ngữ). Có sẵn các kích thước: tiny (39M, WER 10% EN, 15% RU), small (244M, WER 6% EN, 10% RU), medium (769M, WER 4.5% EN, 8% RU). Whisper chạy trên thiết bị di động qua Core ML (iOS, ANE) và TFLite (Android, GPU). Whisper tiny: RTF 4–10 trên CPU, RTF 0.5–2 trên GPU (Android). Whisper small: RTF 2–6 trên GPU. Whisper medium — RTF 8–15, chỉ cho không thời gian thực.

Whisper trên iOS (Core ML): Apple MLX Whisper — triển khai Whisper cho Core ML và MLX (Apple Neural Engine). Whisper tiny Core ML trên iPhone 15 Pro: RTF 0.3–0.8 (nhanh hơn thời gian thực!). Whisper small Core ML: RTF 1–3. Whisper Core ML sử dụng ANE trên A17 Pro (Neural Engine 35 TOPS). Hugging Face Transformers → Xuất sang Core ML qua coremltools-whisper. Để phát trực tiếp, hãy sử dụng WhisperStitcher (chia khối + ghép). Whisper trên iOS là ASR trên thiết bị chính xác nhất (WER 6% EN, 10% RU).

swift
// Whisper Core ML on 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) // final text with timestamps
}

Whisper so với Vosk: Whisper chính xác hơn (6% so với 9% WER EN), hỗ trợ 99 ngôn ngữ, bao gồm phát hiện ngôn ngữ, dấu câu và nhận dạng cảm xúc. Whisper nặng hơn (39M–769M so với 50M Vosk), chậm hơn trong thời gian thực (RTF 0.5–6 so với 0.3–0.8). Whisper tiny tương đương Vosk về tốc độ (RTF 0.5–2 GPU). Vosk nhẹ hơn, nhanh hơn, tốt hơn cho phát trực tiếp thời gian thực. Whisper dành cho phiên âm một lần nơi độ chính xác được ưu tiên hơn tốc độ. Vosk dành cho nhập liệu giọng nói thời gian thực. Sử dụng Whisper cho văn bản cuối cùng, Vosk cho sử dụng tương tác.

Ứng dụng Nhận dạng giọng nói trong di động

Nhập văn bản bằng giọng nói — ứng dụng phổ biến nhất của ASR: đọc chính tả tin nhắn, truy vấn tìm kiếm, ghi chú. Yêu cầu: RTF < 1 (thời gian thực), kết quả một phần (xem văn bản khi nói). Android Gboard và Bàn phím iOS có ASR tích hợp (trên thiết bị, WER 12–18%). Để triển khai tùy chỉnh, hãy sử dụng Android SpeechRecognizer / SFSpeechRecognizer. Để có độ chính xác tối đa — ASR đám mây + dự phòng Vosk. Để nhập liệu giọng nói với độ chính xác 98% bằng tiếng Nga — kết hợp Vosk (ngoại tuyến) + Yandex SpeechKit (trực tuyến).

Phiên âm cuộc gọi và cuộc họp — ASR để tạo bản phiên âm tự động. Yêu cầu: không yêu cầu độ trễ, WER < 10%, phân đoạn người nói (ai đang nói). Whisper Small (ngoại tuyến) + pyannote-audio (phân đoạn) là ngăn xếp tiêu chuẩn cho phiên âm. Trên iOS — Whisper Core ML (RTF 1–3, WER 6–10%). Trên Android — Whisper TFLite (RTF 2–6, WER 8–12%) hoặc Google Cloud ASR + phân đoạn. Để bảo mật (cuộc gọi không lên máy chủ) — Whisper trên thiết bị. Độ chính xác phân đoạn: 80–90% DER.

Trợ lý giọng nói — Siri (SFSpeechRecognizer), Google Assistant (Android SpeechRecognizer), Alexa (ASR trên thiết bị). Trợ lý tùy chỉnh: ASR → NLU (Hiểu ngôn ngữ tự nhiên) → Hành động → TTS. ASR là giai đoạn đầu tiên — quyết định độ chính xác của toàn bộ chuỗi. Đối với NLU, hãy sử dụng RASA, Snips NLU (trên thiết bị) hoặc NLU đám mây (Dialogflow, Amazon Lex). Đối với TTS: Android TTS / iOS AVSpeechSynthesizer. Trợ lý giọng nói trên thiết bị (Vosk + RASA + TTS) hoàn toàn riêng tư, hoạt động không cần internet, độ trễ < 2 giây mỗi yêu cầu.

kotlin
// Voice assistant with 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)
    }
})

Trợ năng cho người khuyết tật vận động — Nhận dạng giọng nói cho phép điều khiển ứng dụng bằng giọng nói: mở danh bạ, gửi tin nhắn, quay số. Android Voice Access và iOS Switch Control + VoiceOver là các giải pháp tích hợp. Để triển khai tùy chỉnh: GrammarRecogniser (Vosk) với tập lệnh cố định (50–100 cụm từ) — RTF 0.1–0.3, độ chính xác 99%. Vosk Grammar cho phép định nghĩa ngữ pháp ở định dạng BNF. Tốc độ rất quan trọng đối với trợ năng — Vosk Grammar nhanh hơn 5 lần so với nhận dạng tự do và tiêu thụ ít pin hơn.

Câu hỏi thường gặp

Làm thế nào để cải thiện độ chính xác nhận dạng giọng nói trong môi trường ồn ào?

Sử dụng giảm nhiễu (WebRTC NS — tích hợp trong Android, iOS AVAudioSession). Áp dụng VAD để cắt các đoạn không phải lời nói. Tăng SNR bằng micrô có beamforming (ghi âm định hướng) hoặc dàn micrô đa hướng. Whisper chịu nhiễu tốt hơn (được đào tạo trên 680K giờ có nhiễu). Vosk với giảm nhiễu qua WebRTC cho +5% WER ở nhiễu 50 dB. Đối với sản xuất, hãy kiểm tra với điều kiện nhiễu của ứng dụng của bạn.

Có thể nhận dạng giọng nói không cần internet trên iOS không?

Có, từ iOS 17 SFSpeechRecognizer hỗ trợ chế độ trên thiết bị (requiresOnDeviceRecognition = true). Trên iOS 16 trở xuống, trên thiết bị không khả dụng — yêu cầu internet cho ASR Siri/Gboard. Thay thế: Vosk qua trình bao bọc C++ (ngoại tuyến, WER 12–15%), Whisper Core ML (ngoại tuyến, WER 6–10%, độ trễ 2–6x). Để nhập liệu giọng nói trên iOS 16-, hãy sử dụng Vosk. Whisper Core ML dành cho phiên âm tệp âm thanh (không thời gian thực). Tất cả các giải pháp đều hoàn toàn riêng tư và hoạt động không cần internet.

Android SpeechRecognizer hỗ trợ những ngôn ngữ nào?

Android SpeechRecognizer hỗ trợ 60+ ngôn ngữ qua RecognizerIntent.EXTRA_LANGUAGE. Danh sách đầy đủ được xác định bởi Locale.getAvailableLocales() trên thiết bị. Tiếng Nga, tiếng Anh, tiếng Đức, tiếng Pháp, tiếng Tây Ban Nha, tiếng Ý luôn có sẵn. Tiếng Trung, tiếng Nhật, tiếng Hàn phụ thuộc vào kiểu máy. Chế độ trên thiết bị (Android 10+) — 20+ ngôn ngữ. Không giống như Vosk (20 ngôn ngữ) và SFSpeechRecognizer (60 ngôn ngữ), Android SpeechRecognizer phụ thuộc vào phiên bản Google Play Services.

Làm thế nào để thiết lập nhận dạng giọng nói cho một lĩnh vực cụ thể (y tế, pháp lý)?

Sử dụng điều chỉnh mô hình: tinh chỉnh Whisper trên 100+ giờ âm thanh lĩnh vực (Hugging Face Trainer). Vosk — thay thế Mô hình ngôn ngữ (định dạng ARPA) bằng kho văn bản lĩnh vực (100K+ câu). Google Cloud ASR — phrase hints (từ lĩnh vực, DL=0/1/2). SFSpeechRecognizer — SFSpeechRecognitionTaskDelegate với contextualStrings (mảng chuỗi gợi ý). Điều chỉnh lĩnh vực cải thiện độ chính xác 15–30% WER cho thuật ngữ chuyên ngành. Tối thiểu: 500 tệp âm thanh lĩnh vực có bản phiên âm.

Làm thế nào để tính WER (Word Error Rate) cho ASR?

WER = (S + D + I) / N, trong đó S — thay thế, D — xóa, I — chèn, N — số từ trong văn bản tham chiếu. Ví dụ: tham chiếu = “xin chào bạn khỏe không”, dự đoán = “xin chào bạn làm gì thế” → S=1 (khỏe→làm), D=1 (xóa “không”?), I=0 → WER = 2/3 = 66%. Sử dụng thư viện jiwer (Python) hoặc WER Calculator (JavaScript) để tính toán. CER tương tự ở cấp độ ký tự. Đối với tiếng Nga, CER thấp hơn WER 20–30% do độ dài từ.

Tổng kết

  • Nhận dạng giọng nói (ASR) — chuyển đổi âm thanh thành văn bản qua mô hình CTC/RNNT/Transformer
  • Android SpeechRecognizer — 60+ ngôn ngữ, đám mây + trên thiết bị (Android 10+), WER 8–15%
  • SFSpeechRecognizer (iOS) — 60+ ngôn ngữ, trên thiết bị từ iOS 17, WER 7–14%
  • Vosk — ASR ngoại tuyến, 20+ ngôn ngữ, RTF 0.3–0.8, WER 9–13%
  • Whisper — ASR chính xác nhất (WER 6% EN), 99 ngôn ngữ, nhưng nặng cho thời gian thực
  • Trên thiết bị — quyền riêng tư, không cần internet, Vosk/Whisper Core ML
  • Ứng dụng — nhập giọng nói, phiên âm, trợ lý, trợ năng

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm