音声認識(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)はパイプラインです:オーディオ → 前処理(16 kHzモノラル、ノイズ低減、VAD — 音声アクティビティ検出)→ 特徴抽出(MFCC、LogMel FilterBank)→ 音響モデル(ニューラルネットワーク:CTC / RNNT / Transducer)→ 言語モデル(LM)→ デコード(テキスト)。最新のエンドツーエンドモデル(Whisper、Google USM、Conformer CTC)は音響モデルと言語モデルを1つのTransformerに統合し、パイプラインを簡素化して精度を向上させます。
モバイルデバイス向けASRアーキテクチャ:CTC(Connectionist Temporal Classification)— 高速で、オーディオとテキストのアライメントが不要、VoskやAndroidネイティブで使用。RNNT(Recurrent Neural Network Transducer)— ストリーミングASR、低レイテンシ(Google USM)。Conformer — CNN + Transformerのハイブリッド、最高の精度だがより重い:Whisper Medium(769Mパラメータ)— 30–60倍のレイテンシ。オンデバイスにはCTCが推奨:Vosk CTCモデルは50–100 MB、レイテンシ0.3–0.8倍リアルタイム。
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 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(音声アクティビティ検出) — 音声アクティビティを検出し、発話を無音やノイズから分離します。WebRTC VADはモバイルASRの標準です:30 msフレーム、3つのモード(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は、音声認識のためのAndroid SDKに組み込まれたクラスです。2つのモードで動作します:クラウド(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を使用。
// 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%)。
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(低レイテンシのストリーミング結果)。
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は、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は話者識別(音声ベクトル分析)もサポート。
// 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による音声認識モデルで、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)。
// 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の最も広範な用途:メッセージ、検索クエリ、メモの dictated入力。要件: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秒。
// 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 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は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のドメインオーディオファイル。
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%低くなります。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。