SFSpeechRecognizer — 概要、API、iOS統合

著者: IT Sectr 公開日: 2026-07-19 読了時間: 10 分

SFSpeechRecognizerは、iOSエコシステムにおけるAppleの主要な音声認識APIです。このフレームワークは、Speech.frameworkを介してデバイスのASRエンジンへのアクセスを提供し、リアルタイムのストリーミング文字起こしと1回限りの音声ファイル認識をサポートします。SFSpeechRecognizerはiOS 10+、macOS 10.15+、watchOS 6+、tvOS 17+で利用可能です。iOS 17では、Appleはインターネット接続なしで音声認識を可能にする完全なオンデバイスモードを追加しました。Apple Speech Documentation、2025によると、SFSpeechRecognizerは20万以上のApp Storeアプリケーションで使用され、英語で7%のWERで毎日数百万のリクエストを処理しています。

主要ポイント

  • SFSpeechRecognizer — iOS向けAppleの主要ASR API(iOS 10+)
  • オンデバイス — iOS 17からインターネット不要の認識、ロシア語でWER 12–14%
  • ストリーミング — リアルタイムでの部分結果
  • 60以上の言語 — ロシア語、英語、中国語、アラビア語など
  • Swiftネイティブ — AVFoundation、Combine、Swift Concurrencyとの完全統合

SFSpeechRecognizerとは:機能概要

SFSpeechRecognizerは、特定の言語の音声認識を表すSpeech.frameworkのクラスです。Locale(ru_RU、en_US、zh_CN)で初期化されます。SFSpeechRecognizerは認識リクエスト(SFSpeechRecognitionRequest)を管理し、文字起こしとメタデータを含む結果(SFSpeechRecognitionResult)を返します。2種類のリクエストをサポートしています:SFSpeechAudioBufferRecognitionRequest(ライブオーディオストリーム)とSFSpeechURLRecognitionRequest(音声ファイル)。どちらもSFTranscriptionを返します — 代替認識仮説の配列です。

SFSpeechRecognitionResultには以下が含まれます:bestTranscription(最良仮説、SFTranscription)、transcriptions(すべての代替)、isFinal(最終/中間)。SFTranscriptionには以下が含まれます:formattedString(テキスト)、segments(タイムスタンプ、信頼度、substringRange、alternativeSubstringsを含むSFTranscriptionSegmentの配列)。各セグメントの信頼度(0..1) — 信頼できない断片をフィルタリングできます。SegmentsはSpeech.frameworkの主要機能です:信頼度スコア付きの単語単位のマークアップを提供します。

SFSpeechRecognizerのアーキテクチャ:AVFoundation(オーディオキャプチャ)→ Audio Buffer → SFSpeechAudioBufferRecognitionRequest → SFSpeechRecognizer(ASRエンジン)→ SFSpeechRecognitionResult → SFSpeechRecognitionTask(制御:cancel、finish、pause)。AppleのASRエンジンはハイブリッドアーキテクチャを使用しています:オンデバイス用にConformer(エンコーダ)+ RNNT(デコーダ)、クラウド用にTransducer。モデルはApple Neural Engine(ANE)向けに最適化されています。A17 Proでは、オンデバイスASRはRTF 0.3–0.6(リアルタイムより高速)で動作します。

コンポーネント目的iOSバージョン
SFSpeechRecognizerメイン認識クラスiOS 10+
SFSpeechAudioBufferRecognitionRequestライブオーディオストリームiOS 10+
SFSpeechURLRecognitionRequest音声ファイル(.wav、.m4a)iOS 10+
SFSpeechRecognitionTaskリクエスト管理(cancel、finish)iOS 10+
オンデバイス認識オフラインASRiOS 17+
複合認識ハイブリッド オンデバイス + クラウドiOS 17+

オーディオ要件:SFSpeechRecognizerはLPCM(16 kHz、16 bit、モノラル)またはOpus(iOS 17+)を受け付けます。AVFoundationは任意の形式のバッファをキャプチャでき、リクエストが自動的に変換します。最小長:0.5秒(無音検出)。最大:1分(クラウド)/ 2分(オンデバイス)1リクエストあたり。長い文字起こしの場合は、2~5秒のオーバーラップで30~60秒のチャンクに音声を分割します。

SFSpeechRecognizerの設定と権限

ユーザー権限:SFSpeechRecognizerには2つの明示的な権限が必要です。NSMicrophoneUsageDescription(Privacy — Microphone Usage Description) — マイクアクセス用。NSSpeechRecognitionUsageDescription(Privacy — Speech Recognition Usage Description) — 音声認識アクセス用。どちらもユーザーに理由を説明する文字列です。SFSpeechRecognizer.requestAuthorization — 権限ダイアログを表示します。ステータス:notDetermined、denied、restricted、authorized。authorizedステータスがないと、recognizerを呼び出すとエラー216(Speech framework error)が返ります。

可用性の確認:SFSpeechRecognizer.isAvailable — 現在の言語でASRが利用可能かどうかを確認します。iOS 16-では、isAvailable = false(インターネットなし)。iOS 17+では、オンデバイス言語の場合はオフラインでもisAvailable = true。SFSpeechRecognizer.supportedLocales — デバイスでサポートされている言語のリストを取得する静的メソッド。起動のたびにisAvailableを確認することをお勧めします(ユーザーが設定でSiri/ディクテーションを無効にする可能性があります)。可用性は地域によって異なります:中国語 — 中国のみ、アラビア語 — UAE。

swift
// SFSpeechRecognizerのセットアップ
import Speech

SFSpeechRecognizer.requestAuthorization { status in
    guard status == .authorized else { return }
}

let recognizer = SFSpeechRecognizer(locale: Locale(identifier: "ru_RU"))!
guard recognizer.isAvailable else {
    print("ASRが利用できません。設定でSiriとディクテーションを有効にしてください")
    return
}

let request = SFSpeechAudioBufferRecognitionRequest()
request.requiresOnDeviceRecognition = true

エラーハンドリング:SFSpeechRecognizerはErrorを返す可能性のあるcompletion handler付きで呼び出されます。主なエラー:203 — インターネットなし(クラウド、iOS 16-);216 — 未承認(権限なし);301 — オーディオエラー(マイク/フォーマットの問題);401 — サービス利用不可(サービス過負荷);601 — 言語利用不可(デバイスで言語がサポートされていない)。オンデバイスiOS 17+の場合、主なエラー:301(オーディオ)、601(言語)。常にcompletion handlerを処理してください — 録音中いつでもエラーが発生する可能性があります。

マイクからのライブ音声認識

ライブASRパイプライン:AVAudioEngine(マイクキャプチャ)→ installTap(オーディオバッファ)→ request.append(buffer) → SFSpeechRecognizer → recognitionTask → delegate/resultHandler。AVAudioEngineは低レイテンシ(マイクからバッファまで5~10 ms)を提供します。SFSpeechRecognitionDelegate:didHypothesizeTranscription(200~500 msごと — 部分テキスト)、didFinishRecognition(最終結果)。Task.isFinishing — 認識が完了したらキャンセルできます。連続認識(無限ディクテーション)の場合は、isFinalの後に新しいタスクを作成します。

SFSpeechRecognitionTaskDelegate:オプションのメソッド。speechRecognitionDidDetectSpeech(発話開始) — UI表示用。didHypothesizeTranscription(中間テキスト) — 発話中に表示用。didFinishRecognition(最終結果) — テキスト確定用。didFinishSuccessfully(成功/エラー) — 完了用。didProcessAudio(オーディオバッファ処理済み) — RMSメーター用。didHypothesizeTranscriptionの実装をお勧めします — ユーザーは遅延なく即座にテキストを表示できます。最終文字起こしは保存用です。

swift
// ライブ音声認識
let audioEngine = AVAudioEngine()
let request = SFSpeechAudioBufferRecognitionRequest()
request.shouldReportPartialResults = true

recognitionTask = recognizer.recognitionTask(with: request) { result, error in
    if let result = result {
        textView.text = result.bestTranscription.formattedString
    }
    if error != nil || result?.isFinal == true {
        audioEngine.stop()
        request.endAudio()
    }
}

let inputNode = audioEngine.inputNode
let recordingFormat = inputNode.outputFormat(forBus: 0)
inputNode.installTap(onBus: 0, bufferSize: 1024,
                     format: recordingFormat) { buffer, _ in
    request.append(buffer)
}
audioEngine.prepare()
try audioEngine.start()

連続認識:「常時 listening」モード(音声入力、アシスタント)の場合、isFinalの後にタスクを再起動する必要があります。ループを作成:finishTask → request = SFSpeechAudioBufferRecognitionRequest() → recognitionTask = recognizer.recognitionTask(with: request)。ギャップを避けるには、1つのタスクの終了を次のタスクの開始とオーバーラップさせます(前のタスクが終了する1~2秒前に新しいリクエストを開始)。AVFoundation AVAudioSession — 同時再生と録音のために.playAndRecordを設定します。iOS 17+では、オンデバイスでの連続ASRは1時間あたり2~5%のバッテリーを消費します(A15+)。

音声ファイルと録音の認識

SFSpeechURLRecognitionRequest — URLによる音声ファイル認識用のリクエスト。対応形式:.wav(16 kHz、16 bit、モノラル)、.m4a(AAC)、.mp4、.mov。最大長:クラウドで約1分、オンデバイスで約2分。長いファイルの場合は、チャンクに分割します(AVAssetExportSession + trim)。SFSpeechURLRecognitionRequestはストリーミングをサポートしていません(部分結果なし) — 最終結果のみ。ファイルで部分結果を得るには、Audio Buffer Requestに変換します。

音声ファイルの文字起こしを取得する:SFSpeechRecognizer.recognitionTask(with: request) resultHandler。bestTranscription.formattedStringを抽出します。単語レベルのタイムスタンプ — bestTranscription.segmentsのsegments(segment.duration、segment.timestamp、segment.substring)。セグメントごとの信頼度 — 各単語のASR信頼度(フィルタリングに使用)。代替仮説 — 信頼度の低い単語のtranscriptionFormatter代替案。複数の話者がいるファイルの場合、SFSpeechRecognitionRequestは複数のリクエストを返すことがあります(話者ごとに1つ、iOS 17+)。

swift
// 音声ファイルの文字起こし
let audioURL = Bundle.main.url(forResource: "recording", withExtension: "m4a")!
let request = SFSpeechURLRecognitionRequest(url: audioURL)
request.requiresOnDeviceRecognition = true

recognizer.recognitionTask(with: request) { result, error in
    guard let result = result, error == nil else {
        print("エラー:\(error?.localizedDescription ?? "unknown")")
        return
    }

    let transcription = result.bestTranscription
    let text = transcription.formattedString
    let words = transcription.segments.map { segment in
        Word(text: segment.substring,
              start: segment.timestamp,
              duration: segment.duration,
              confidence: segment.confidence)
    }
}

長い音声ファイルの分割:1分以上のファイルは、2~3秒のオーバーラップ(ステッチ)で30~60秒のチャンクに分割します。AVAssetExportSession + CMTimeRange — チャンクをエクスポート。代替:UISelectionView(ユーザーがセグメントを選択)。文字起こしのステッチ:テキストを連結、オーバーラップでステッチ(前のチャンクの最後の2~3単語を次のチャンクの最初の2~3単語と比較 — 重複を削除)。VoskとWhisperは長い音声をネイティブでサポートしていますが、SFSpeechRecognizerはサポートしていません。長い文字起こしには、Whisper(Core ML)をお勧めします — 長さの制限がありません。

オンデバイス vs クラウド:モード比較

オンデバイスモード(iOS 17+):request.requiresOnDeviceRecognition = true。ASRはApple Neural Engine(ANE)上でローカルに実行されます。利点:インターネット不要、プライバシー(音声がデバイスから出ない)、ゼロコスト(無料)、低レイテンシ(RTF 0.3–0.6)。欠点:精度が低い(WER 12–14% vs 7–12%)、リクエストあたり2分の制限、限られた言語セット(60言語すべてがオンデバイスで利用可能とは限らない)。オンデバイスモデルはデバイス上で約50~100 MBを占有し、最初のリクエスト時にダウンロードされます。

クラウド(iOS 16-):request.requiresOnDeviceRecognition = false(またはパラメータなし)。Appleサーバー上のASR — より高精度(WER 7% EN、12% RU)、より多くの言語、リクエストあたり最大1分。インターネット(WiFiまたはセルラー)が必要。AppleはクラウドASRに対して開発者に課金しません(無料)。制限:アプリケーションあたり1分間に1リクエスト(未指定)ですが、Appleはプロダクション規模で制限する可能性があります。クラウドASRはSLAなしのベストエフォート品質を提供します。エンタープライズアプリの場合は、Google Cloud ASRまたはWhisper(Core ML)を使用してください。

パラメータオンデバイス(iOS 17+)クラウド(iOS 10+)
インターネット必要いいえはい
WER(EN)10–12%7%
WER(RU)12–14%12%
レイテンシ(RTF)0.3–0.60.3–0.8(+ネットワーク)
最大長2分1分
プライバシー完全音声がデバイスから出る
無料はいはい

複合認識(iOS 17+):request.requiresOnDeviceRecognition = false(インターネットあり、クラウド)、= true(オフライン時、フォールバック)。Appleが自動的にモードを選択します。精度重視のアプリの場合:NetworkMonitor(NWPathMonitor)を確認 — インターネット時はクラウド、なし時はオンデバイス。プライバシー重視のアプリの場合:常にオンデバイス。文字起こしの場合:クラウド(より正確)。音声入力の場合:オンデバイス(より高速)。複合モードをお勧めします:80%クラウド、20%オンデバイスフォールバック。

iOSアプリでのSFSpeechRecognizerの活用

カスタムキーボードでの音声入力 — SFSpeechRecognizerをキーボード拡張機能(iOS 10+)に統合。ユーザーがマイクボタンを押すと、ASRが音声をテキストに文字起こししてテキストフィールドに挿入します。要件:部分結果(リアルタイムでテキストを表示)、オンデバイス(キーボードはインターネットなしで動作する必要があります)。SFSpeechRecognizer + AVSpeechSynthesizer — 音声入力 + 音声出力。iOS 17+のカスタムキーボードでは、オンデバイスを使用します。キーボード拡張機能の制限:AVAudioEngineは利用可能ですが、時間制限があります(バックグラウンド実行は制限されています)。

会議や講義の文字起こし — 音声を録音・文字起こしするアプリ(Otter.ai、Rev、Apple Voice Memos)。SFSpeechURLRecognitionRequestは.m4aファイルを処理します。長時間の録音(30~60分)の場合 — Whisper Core ML(長さの制限なし)。タイムスタンプ付きのSFSpeechRecognizer segments — テキストと音声の同期用(再生中のテキストハイライト)。セグメントごとの信頼度 — 信頼できない断片の表示用(黄色のハイライト)。話者ダイアライゼーション(誰が話したか) — AppleはAPIを提供していないため、サーバー上でpyannote-audio + Whisperを使用します。

iOSアプリでの音声コマンド — SFSpeechRecognizer + VGSフレームワーク(Voice Grammar Services)でコマンドを実行:「設定を開く」「メッセージを送信」「ライトをつける」。文法ベースの認識:SFSpeechRecognitionRequest contextualStrings = コマンドの配列。これにより、コマンド認識精度が95%に向上します(自由形式の85%に対して)。SFSpeechRecognitionTask.cancel — コマンド実行後に中断。VGS + SFSpeechRecognizer + Shortcuts — UIを書かずにカスタム音声コマンド。アクセシビリティ用:Voice Control(組み込み)+ SFSpeechRecognizer(カスタムコマンド)。

swift
// コンテキスト文字列を使用した音声コマンド
let request = SFSpeechAudioBufferRecognitionRequest()
request.requiresOnDeviceRecognition = true
request.shouldReportPartialResults = true
request.contextualStrings = ["open contacts", "send message",
                             "show notifications", "懐中電灯をつける"]

recognitionTask = recognizer.recognitionTask(with: request) { result, _ in
    guard let text = result?.bestTranscription.formattedString.lowercased() else { return }
    voiceCommands.first { text.contains($0) }.map { command in
        DispatchQueue.main.async { self.executeCommand(command) }
        recognitionTask?.cancel()
    }
}

医療・法律アプリでのディクテーション — SFSpeechRecognizerで音声による構造化ドキュメント作成。ドメイン適応:医療/法律用語を含むcontextualStrings(500以上のフレーズ)。SFSpeechRecognitionRequest.customLmProbability — contextualStringsの影響(0.1–1.0)。医療ディクテーションでは、オンデバイスを使用します(患者データのプライバシー)。医療データでファインチューニングされたWhisper — ベースのSFSpeechRecognizerの12%に対してWER 5%の代替手段。HIPAA準拠:オンデバイスモード(データがデバイスから出ない)。予約の文字起こし — SFSpeechURLRecognitionRequest + 話者タイムスタンプ付きsegments。

よくある質問

SFSpeechRecognizerはどのiOSバージョンから対応していますか?

SFSpeechRecognizerはiOS 10、macOS 10.15、watchOS 6、tvOS 17から利用可能です。オンデバイスモードはiOS 17から(requiresOnDeviceRecognition)。iOS 10–16では、SFSpeechRecognizerはAppleのクラウドサーバーを介してのみ動作します(インターネットが必要)。すべてのバージョンで明示的なユーザー権限が必要です(NSMicrophoneUsageDescription + NSSpeechRecognitionUsageDescription)。SFSpeechRecognizer.supportedLocales — 動的リスト、地域とデバイスモデルに依存します。

SFSpeechRecognizerは連続認識に使用できますか?

はい、isFinalの後に新しいrecognitionTaskを作成することで可能です。連続認識のためには、前のタスクが完了した後にタスクを再起動します。iOS 17では、オンデバイスでの連続ASRは1時間あたり2~5%のバッテリーを消費します(A15+)。iOS 16-では、連続ASRにはインターネットが必要です(トラフィック約1 MB/分)。真の連続認識(常時リスニング)には、Vosk(オフライン)またはWhisper Core MLを使用します。SFSpeechRecognizerはiOS 16-で常時オン モードをサポートしていません。

SFSpeechRecognizerで各単語の信頼度を取得するには?

result.bestTranscription.segmentsを使用します — 各SFTranscriptionSegmentには単語のconfidence(Float 0..1)が含まれています。segments[i].substring — 単語のテキスト。segments[i].confidence — その単語のASR信頼度。confidence < 0.5の単語は信頼できないため、UIで強調表示します。segments[i].timestamp — 開始時間(TimeInterval)。segments[i].duration — 継続時間。segments[i].alternativeSubstrings — 単語の代替認識仮説。長いファイルの場合、segmentsを反復処理することで、手動解析なしで単語ごとの信頼度を得られます。

SFSpeechRecognizerがエラー203を返すのはなぜですか?

203はSFSpeechError.ErrorCode.opportunistic(クラウドASRのインターネットなし)です。iOS 16-で、またはrequest.requiresOnDeviceRecognition = falseでインターネットがない場合に発生します。解決策:オフライン操作にはrequiresOnDeviceRecognition = true(iOS 17+)を設定します。iOS 16-では、NWPathMonitorを使用 — インターネットがない場合、「音声認識にはインターネット接続が必要です」というメッセージを表示します。代替手段:ネットワークが利用できない場合のフォールバックとしてVosk(オフライン、iOS 12+)を使用します。

SFSpeechRecognizerとWhisper Core MLの違いは?

SFSpeechRecognizer — Appleの組み込みAPI、無料、統合が簡単ですが、長さの制限(1~2分)、WER精度7~14%、iOSエコシステムのみ。Whisper Core ML — オープンソース(MIT)、99言語対応、WER 6~10%、長さの制限なし、ただし手動統合、Core MLモデル(39M~769Mパラメータ)、RTF 0.5~6(SFSpeechRecognizerより低速)が必要。SFSpeechRecognizer — 標準的な音声入力用。Whisper — 高精度な長い音声の文字起こし用。

まとめ

  • SFSpeechRecognizer — Apple組み込みASR API、iOS 10+、60以上の言語
  • オンデバイスモード — iOS 17+、インターネット不要、ロシア語でWER 12–14%
  • ライブマイク — AVAudioEngine + request.append(buffer) + 部分結果
  • 音声ファイル — SFSpeechURLRecognitionRequest、.m4a/.wav、最大1~2分
  • Segments — 単語ごとのタイムスタンプ + 信頼度(0..1)
  • 無料 — 制限なし、Apple課金なし、サードパーティSDK不要
  • 用途 — 音声入力、文字起こし、コマンド、アクセシビリティ、ディクテーション

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください