음성 인식 — 개념, 기술 및 작동 원리

저자: IT Sectr 게시일: 2026-07-19 읽는 시간: 10 분

음성 인식 (ASR)은 오디오 신호를 텍스트 시퀀스로 변환하는 자동 음성 인식 기술입니다. 최신 시스템은 딥러닝을 사용합니다. 인코더(Conformer, Whisper, BiLSTM + CTC)는 오디오 스펙트로그램을 은닉 상태 시퀀스로 변환하고, 디코더(CTC greedy decoding, Beam Search, Transformer decoder)는 텍스트를 생성합니다. 모바일 애플리케이션에서 음성 인식은 음성 입력, 음성 어시스턴트, 자동 통화 전사, 운동 장애가 있는 사람들을 위한 접근성 기능에 사용됩니다. Google Cloud Speech-to-Text, 2025에 따르면, 클라우드 ASR은 SNR > 15 dB에서 영어 WER 7%, 러시아어 WER 12%를 달성합니다.

핵심 포인트

  • 음성 인식 — 신경망을 사용하여 음성을 텍스트(ASR)로 변환
  • Android SpeechRecognizer — 온디바이스 + 클라우드 ASR, 60+ 언어, WER 7–12%
  • SFSpeechRecognizer — iOS 네이티브 인식, iOS 17부터 온디바이스
  • Vosk — 오프라인 ASR, 20+ 언어, 0.5–1.5x 실시간 지연 시간, 러시아어 WER 13%
  • Whisper — OpenAI ASR, Core ML / TFLite를 통한 온디바이스, 다국어

음성 인식이란: ASR 원리

자동 음성 인식 (ASR)은 파이프라인입니다: 오디오 → 전처리(16 kHz 모노, 노이즈 감소, VAD — 음성 활동 감지) → 특징 추출(MFCC, LogMel FilterBank) → 음향 모델(신경망: CTC / RNNT / Transducer) → 언어 모델(LM) → 디코딩(텍스트). 최신 엔드투엔드 모델(Whisper, Google USM, Conformer CTC)은 음향 모델과 언어 모델을 하나의 Transformer로 결합하여 파이프라인을 단순화하고 정확도를 향상시킵니다.

모바일 기기용 ASR 아키텍처: CTC(Connectionist Temporal Classification) — 빠르며 오디오-텍스트 정렬이 필요 없고 Vosk 및 Android 네이티브에서 사용됩니다. RNNT(Recurrent Neural Network Transducer) — 스트리밍 ASR, 낮은 지연 시간(Google USM). Conformer — CNN + Transformer의 하이브리드, 최고의 정확도지만 더 무거움: Whisper Medium(769M 파라미터) — 30–60x 지연 시간. 온디바이스에는 CTC가 선호됨: Vosk CTC 모델은 50–100 MB, 지연 시간 0.3–0.8x 실시간.

ASR 메트릭: WER(Word Error Rate) — 참조 대비 대체, 삭제, 삽입된 단어의 비율. Google Cloud ASR — WER 7%(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온디바이스
Google Cloud ASR7%12%0.3아니요
Android SpeechRecognizer8%13%0.5–1예(하이브리드)
SFSpeechRecognizer7%12%0.3–0.8예(iOS 17부터)
Vosk (vosk-model-small-ru)9%13%0.3–0.8
Whisper Small6%10%2–6

VAD(음성 활동 감지) — 음성 활동을 감지하여 발성을 침묵과 노이즈로부터 분리합니다. WebRTC VAD는 모바일 ASR의 표준: 30 ms 프레임, 세 가지 모드(0, 1, 2 — 보수적에서 공격적까지). VAD는 RTF를 1.5–3배 줄입니다(비발성 세그먼트 건너뜀). Silero VAD(MIT)는 신경망 VAD로 WebRTC(94% 대 85% ROC AUC)보다 정확하며, 5–10 ms 지연 시간, TFLite 및 Core ML 지원. 프로덕션 ASR의 경우 VAD → ASR 캐스케이드를 사용하세요: 이는 오탐지를 줄이고 처리를 가속화합니다.

Android SpeechRecognizer API

Android SpeechRecognizer는 음성 인식을 위한 Android SDK 내장 클래스입니다. 두 가지 모드로 작동합니다: 클라우드(Google 서버) — 높은 정확도, 인터넷 필요; 온디바이스(Android 10+부터) — GBoard 임베디드 ASR 모델, 20+ 언어, WER 15–18%. SpeechRecognizer는 발성 중 중간 결과(부분 결과)와 최종 텍스트를 반환합니다. RecognizerIntent.EXTRA_LANGUAGE를 통해 60+ 언어 지원. 음성 입력에 권장 — 빠른 통합, 무료.

SpeechRecognizer API: SpeechRecognizer.createSpeechRecognizer(context)로 생성. RecognizerIntent.ACTION_RECOGNIZE_SPEECH가 포함된 Intent에 LANGUAGE_MODEL_FREE_FORM(자유 텍스트) 또는 LANGUAGE_MODEL_WEB_SEARCH(검색 쿼리) extra 설정. RecognitionListener를 통한 결과: onReadyForSpeech → onBeginningOfSpeech → onRmsChanged → onPartialResults → onResults. 연속 인식(항상 듣기 모드)의 경우 — onResults 후 인식기를 다시 시작. 배터리 절약을 위해 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)

Android에서 온디바이스 vs 클라우드: 온디바이스는 인터넷 없이 작동(Android 10+, Pixel 4+, Samsung S20+). 클라우드는 더 정확(Google Neural Network ASM Model)하지만 지연 시간이 더 높음(네트워크 포함 300–800 ms). 음성 입력의 경우 하이브리드 접근 방식 사용: 네트워크가 없을 때 온디바이스로 폴백하는 클라우드. Android SpeechRecognizer는 RecognizerIntent.EXTRA_PREFER_OFFLINE에 따라 자동으로 모드를 선택. 최대 프라이버시를 위해 — onDeviceOnly = true 설정(단, 러시아어 정확도는 WER 15–18%).

iOS SFSpeechRecognizer 및 Speech Framework

SFSpeechRecognizer는 iOS, macOS 및 watchOS용 Apple의 음성 인식 프레임워크입니다. iOS 10부터 사용 가능. 온디바이스 모드 — iOS 17부터(로컬 모델, 인터넷 불필요). 60+ 언어 지원. 정확도: WER 7–12%(온디바이스 — 12–15%). SFSpeechRecognizer는 Speech.framework를 통해 사용 가능 — 추가 SDK 불필요. SFSpeechRecognizer.requestAuthorization을 통한 권한 요청.

SFSpeechRecognizer API: SFSpeechRecognizer(locale: Locale(identifier: "ru_RU")) → SFSpeechAudioBufferRecognitionRequest(라이브 오디오) 또는 SFSpeechURLRecognitionRequest(오디오 파일). SFSpeechRecognitionTaskDelegate(didHypothesizeTranscription — 부분, didFinishRecognition — 최종)와 함께 recognitionTask(with:delegate:)를 통한 스트리밍. 온디바이스 모드: request.requiresOnDeviceRecognition = true. iOS 15+의 경우: request.shouldReportPartialResults = true(낮은 지연 시간의 스트리밍 결과).

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 vs Android SpeechRecognizer: SFSpeechRecognizer는 재시작 없이 네이티브 스트리밍 제공(Android는 반복적인 startListening 필요). iOS의 온디바이스는 iOS 17부터 사용 가능(Android는 Android 10부터). 둘 다 사용자 권한 필요(iOS의 경우 NSMicrophoneUsageDescription + NSSpeechRecognitionUsageDescription, Android의 경우 RECORD_AUDIO). SFSpeechRecognizer는 영어에서 더 정확(온디바이스), Android SpeechRecognizer는 러시아어에서 더 정확(클라우드). iOS 17 이전에는 온디바이스 사용 불가 — 인터넷 필요. iOS 17+의 경우 온디바이스는 러시아어 WER 12–14%.

Vosk: 20+ 언어 오프라인 인식

Vosk는 Alpha Cephei의 오프라인 음성 인식을 위한 오픈소스 ASR 라이브러리입니다. Kaldi ASR 툴킷 + CTC 모델 기반. 20+ 언어 지원: 러시아어, 영어, 독일어, 프랑스어, 스페인어, 중국어, 아랍어. 모델 50 MB(소형 — 50 MB, ru)에서 1.2 GB(대형 — 1.2 GB, en)까지. Vosk는 Android(JNI), iOS(C++ 래퍼), Linux, Windows, Raspberry Pi에서 작동. RTF: 플래그십 기기에서 0.3–0.8. Vosk는 완전한 오프라인 ASR에 최적의 선택입니다.

Vosk API: VoskWaveformModelLoader(모델 로딩) → VoskWaveformRecognizer(인식기 생성) → recognizer.createGrammar(list) 또는 recognizer.getResult() / recognizer.getPartialResult(). 문법 지원(고정 명령 세트) — GrammarRecogniser — RTF 0.1–0.3(3배 빠름). 음성 입력에는 자유 인식(getResult) 사용. 음성 명령에는 — GrammarRecogniser(명령 99% 정확도). Vosk는 화자 식별(음성 벡터 분석)도 지원.

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 vs 클라우드 ASR: Vosk는 완전히 오프라인 — 프라이버시, 제로 지연 시간, 무료. 클라우드(Google, Yandex)는 복잡한 시나리오(노이즈, 악센트)에서 더 정확 — WER 3–5% 낮음. Vosk는 다음에 이상적: 인터넷 없는 음성 입력, 접근성 앱, 통화 전사(프라이버시). 클라우드 ASR은 정확도가 프라이버시보다 중요한 음성 어시스턴트용. 권장사항: 오프라인용 Vosk, 온라인용 SFSpeechRecognizer(iOS) / SpeechRecognizer(Android) — 시나리오에 따라 접근 방식 결합.

모바일 기기에서 Whisper OpenAI

Whisper는 OpenAI의 음성 인식 모델로, 680,000시간의 오디오(다국어, 99개 언어)로 학습되었습니다. 크기: tiny(39M, WER 10% EN, 15% RU), small(244M, WER 6% EN, 10% RU), medium(769M, WER 4.5% EN, 8% RU). Whisper는 Core ML(iOS, ANE) 및 TFLite(Android, GPU)를 통해 모바일 기기에서 실행. Whisper tiny: CPU에서 RTF 4–10, GPU에서 RTF 0.5–2(Android). Whisper small: GPU에서 RTF 2–6. Whisper medium — RTF 8–15, 비실시간 전용.

iOS에서 Whisper (Core ML): Apple MLX Whisper — Core ML 및 MLX(Apple Neural Engine)용 Whisper 구현. iPhone 15 Pro에서 Whisper tiny Core ML: RTF 0.3–0.8(실시간보다 빠름!). Whisper small Core ML: RTF 1–3. Whisper Core ML은 A17 Pro(Neural Engine 35 TOPS)의 ANE 사용. Hugging Face Transformers → coremltools-whisper를 통해 Core ML로 내보내기. 스트리밍에는 WhisperStitcher(청킹 + 스티칭) 사용. iOS의 Whisper는 가장 정확한 온디바이스 ASR(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 vs Vosk: Whisper가 더 정확(6% 대 9% WER EN), 99개 언어 지원, 언어 감지, 구두점 및 감정 인식 포함. Whisper가 더 무겁고(39M–769M 대 50M Vosk), 실시간에서 더 느림(RTF 0.5–6 대 0.3–0.8). Whisper tiny는 속도에서 Vosk와 비슷(RTF 0.5–2 GPU). Vosk는 더 가볍고 빠르며 스트리밍 실시간에 더 적합. Whisper는 정확도가 속도보다 우선시되는 일회성 전사용. Vosk는 실시간 음성 입력용. 최종 텍스트에는 Whisper, 대화형 사용에는 Vosk 사용.

모바일 애플리케이션에서 음성 인식 활용

음성 텍스트 입력 — ASR의 가장 광범위한 사용: 메시지, 검색 쿼리, 메모 받아쓰기. 요구사항: RTF < 1(실시간), 부분 결과(말하면서 텍스트 보기). Android Gboard 및 iOS 키보드에는 ASR 내장(온디바이스, WER 12–18%). 사용자 정의 구현에는 Android SpeechRecognizer / SFSpeechRecognizer 사용. 최대 정확도를 위해 — 클라우드 ASR + Vosk 폴백. 러시아어 98% 정확도의 음성 입력을 위해 — Vosk(오프라인) + Yandex SpeechKit(온라인) 결합.

통화 및 회의 전사 — 자동 전사 생성용 ASR. 요구사항: 지연 시간 요구사항 없음, WER < 10%, 화자 분할(누가 말하는지). Whisper Small(오프라인) + pyannote-audio(분할)이 전사의 표준 스택. iOS에서 — Whisper Core ML(RTF 1–3, WER 6–10%). Android에서 — Whisper TFLite(RTF 2–6, WER 8–12%) 또는 Google Cloud ASR + 분할. 프라이버시를 위해(통화가 서버로 전송되지 않음) — 기기에서 Whisper. 분할 정확도: 80–90% DER.

음성 어시스턴트 — Siri(SFSpeechRecognizer), Google Assistant(Android SpeechRecognizer), Alexa(온디바이스 ASR). 사용자 정의 어시스턴트: ASR → NLU(자연어 이해) → 액션 → TTS. ASR은 첫 번째 단계 — 전체 체인의 정확도를 결정. NLU에는 RASA, Snips NLU(온디바이스) 또는 클라우드 NLU(Dialogflow, Amazon Lex) 사용. TTS: Android TTS / iOS AVSpeechSynthesizer. 온디바이스 음성 어시스턴트(Vosk + RASA + TTS)는 완전히 프라이빗하며 인터넷 없이 작동, 요청당 지연 시간 < 2초.

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)
    }
})

운동 장애인을 위한 접근성 — 음성 인식으로 앱을 음성으로 제어 가능: 연락처 열기, 메시지 보내기, 번호 걸기. Android Voice Access 및 iOS Switch Control + VoiceOver는 내장 솔루션. 사용자 정의 구현: GrammarRecogniser(Vosk)와 고정 명령 세트(50–100 구문) — RTF 0.1–0.3, 99% 정확도. Vosk Grammar는 BNF 형식으로 문법 정의 가능. 접근성에는 속도가 중요 — Vosk Grammar는 자유 인식보다 5배 빠르고 배터리 소모 적음.

자주 묻는 질문

시끄러운 환경에서 음성 인식 정확도를 어떻게 개선하나요?

노이즈 억제 사용(WebRTC NS — Android 내장, iOS AVAudioSession). VAD를 적용하여 비발성 부분 제거. 빔포밍(방향성 녹음) 또는 다중 마이크 어레이가 있는 마이크로 SNR 증가. Whisper는 노이즈에 더 강함(노이즈 포함 680K 시간 학습). WebRTC를 통한 노이즈 억제가 있는 Vosk는 50 dB 노이즈에서 +5% WER. 프로덕션의 경우 애플리케이션의 노이즈 조건으로 테스트.

iOS에서 인터넷 없이 음성 인식이 가능한가요?

네, iOS 17부터 SFSpeechRecognizer가 온디바이스 모드(requiresOnDeviceRecognition = true)를 지원합니다. iOS 16 이하에서는 온디바이스 사용 불가 — Siri/Gboard ASR에 인터넷 필요. 대안: C++ 래퍼를 통한 Vosk(오프라인, WER 12–15%), Whisper Core ML(오프라인, WER 6–10%, 지연 시간 2–6배). iOS 16-에서 음성 입력에는 Vosk 사용. Whisper Core ML은 오디오 파일 전사용(실시간 아님). 모든 솔루션은 완전히 프라이빗하며 인터넷 없이 작동.

Android SpeechRecognizer는 어떤 언어를 지원하나요?

Android SpeechRecognizer는 RecognizerIntent.EXTRA_LANGUAGE를 통해 60+ 언어 지원. 전체 목록은 기기의 Locale.getAvailableLocales()로 결정. 러시아어, 영어, 독일어, 프랑스어, 스페인어, 이탈리아어는 항상 사용 가능. 중국어, 일본어, 한국어는 기기 모델에 따라 다름. 온디바이스 모드(Android 10+) — 20+ 언어. Vosk(20개 언어) 및 SFSpeechRecognizer(60개 언어)와 달리 Android SpeechRecognizer는 Google Play Services 버전에 따라 다름.

특정 도메인(의료, 법률)에 맞게 음성 인식을 설정하는 방법은?

모델 적응 사용: 100시간 이상의 도메인 오디오로 Whisper 파인튜닝(Hugging Face Trainer). Vosk — 언어 모델(ARPA 형식)을 도메인 텍스트 코퍼스(10만+ 문장)로 교체. Google Cloud ASR — phrase hints(도메인 단어, DL=0/1/2). SFSpeechRecognizer — contextualStrings(힌트 문자열 배열)가 있는 SFSpeechRecognitionTaskDelegate. 도메인 적응은 특정 용어에 대해 정확도를 15–30% WER 개선. 최소: 전사가 포함된 500개의 도메인 오디오 파일.

ASR의 WER(Word Error Rate)을 계산하는 방법은?

WER = (S + D + I) / N, 여기서 S — 대체, D — 삭제, I — 삽입, N — 참조 텍스트의 단어 수. 예: 참조 = “안녕하세요 어떻게 지내세요”, 예측 = “안녕하세요 무엇을 하세요” → S=1(어떻게→무엇을), D=1(삭제 “지내세요”?), I=0 → WER = 2/3 = 66%. 계산에는 jiwer 라이브러리(Python) 또는 WER Calculator(JavaScript) 사용. CER은 문자 수준에서 유사. 러시아어의 경우 단어 길이로 인해 CER이 WER보다 20–30% 낮음.

요약

  • 음성 인식 (ASR) — CTC/RNNT/Transformer 모델을 통한 오디오-텍스트 변환
  • Android SpeechRecognizer — 60+ 언어, 클라우드 + 온디바이스(Android 10+), WER 8–15%
  • SFSpeechRecognizer (iOS) — 60+ 언어, iOS 17부터 온디바이스, WER 7–14%
  • Vosk — 오프라인 ASR, 20+ 언어, RTF 0.3–0.8, WER 9–13%
  • Whisper — 가장 정확한 ASR(WER 6% EN), 99개 언어, but 실시간에는 무거움
  • 온디바이스 — 프라이버시, 인터넷 불필요, Vosk/Whisper Core ML
  • 응용 — 음성 입력, 전사, 어시스턴트, 접근성

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기