SpeechAnalyzerは、AppleがiOS 26/macOS 26でSpeechフレームワークに追加したオンデバイス音声認識APIです。従来のSFSpeechRecognizerにあった約1分の録音時間制限とオンライン依存を取り払い、講義や会議のような長時間音声もネット接続なしで文字起こしできます。実際の変換はSpeechTranscriberなどのモジュールが担い、SpeechAnalyzerはそれらを束ねて解析セッションを制御する司令塔にあたります。この記事では、SpeechAnalyzerの概要と対応環境、SwiftUIアプリへの実装コード、対応言語とモデル管理、そしてWhisperやクラウドAPIとの比較までを、公式ドキュメントとWWDC25の内容に沿って整理します。
まとめ:SpeechAnalyzerの要点
- 正体:iOS 26/macOS 26以降で使えるAppleの新しいオンデバイス音声認識エンジン。
SFSpeechRecognizerの後継。 - 強み:時間制限なしの長文対応・完全オフライン・サーバーへ音声を送らないプライバシー保護。
- 実装:
SpeechTranscriberをSpeechAnalyzerに渡し、AsyncStreamで音声を供給して逐次結果を受け取る(暫定=volatileと確定=finalの2段構え)。 - 言語:日本語(ja_JP)を含む約40ロケールに対応。モデルは
AssetInventory経由で自動ダウンロード・共有される。 - 制約:iOS 26専用で後方互換なし。旧OSや未対応ロケールは
DictationTranscriber(同じくオンデバイス)で補う。 - Whisper比:Appleは自社モデルが高速と示すが第三者報告ベース。100言語超の対応やカスタマイズ性ではWhisperに分がある。
以下で、進化点・API構成・実装手順・比較を順に見ていきます。
SpeechAnalyzerとは何か
SpeechAnalyzerは、WWDC25のセッション「Bring advanced speech-to-text to your app with SpeechAnalyzer」で発表された、Speechフレームワーク内の新しい音声解析APIです。単体で文字起こしを行うクラスではなく、音声ストリームを受け取り、登録したモジュール(後述のSpeechTranscriberなど)に処理を流す解析コンテキストとして機能します。処理はすべて端末内で完結し、クラウドへ音声を送るサーバー経路は用意されていません。
対応OSとデバイス
SpeechAnalyzerとSpeechTranscriberはiOS 26/iPadOS 26/macOS 26/visionOS 26以降で利用できます。音声認識モデルはNeural Engineを備えたApple Siliconでの実行を前提に最適化されており、対応する新しめのiPhone・iPad・Macが必要です。iOS 26の対応機種や新機能の全体像はiOS 26とは?新機能・対応機種・アップデート方法をわかりやすく解説で確認できます。
日本語を含む対応言語
文字起こしは日本語(ja_JP)を含む約40のロケールに対応します。英語(en_US/en_GBなど)、中国語、韓国語、フランス語、ドイツ語、スペイン語などが含まれ、対応状況はコードからSpeechTranscriber.supportedLocalesで確認できます。未対応の言語では後述のDictationTranscriberがフォールバックになります。
SFSpeechRecognizerからの進化点
旧APIのSFSpeechRecognizerは、iOSの音声認識を長年支えてきた一方で、実運用では次の制約が課題でした。SpeechAnalyzerはこれらを解消するために設計されています。
録音時間制限の撤廃と長文対応
SFSpeechRecognizerは1リクエストあたり約1分という実質的な時間制限があり、講義や会議の長時間録音をそのまま処理できませんでした。SpeechAnalyzerはこの制限を撤廃し、長時間・長文の連続音声を一つのセッションで文字起こしできます。
オンライン依存からオンデバイス完結へ
従来はデバイスや言語によってはサーバーへ音声を送って認識する場面があり、通信環境と手動の権限管理に左右されました。SpeechAnalyzerはオンデバイスで完結し、音声データが端末外へ出ません。プライバシー要件の厳しい医療・法務・社内議事録などでも採用しやすくなっています。
AsyncSequenceベースのSwiftネイティブ設計
APIはSwift Concurrencyを前提に、AsyncStream/AsyncSequenceで音声入力の供給と結果の受信を行います。デリゲートやコールバックを積み重ねる旧来の書き方に比べ、for try awaitで結果を素直に受け取れるため、リアルタイム表示の実装が簡潔になります。
APIを構成する4つのクラス
SpeechAnalyzerの実装では、役割の違う複数のクラスを組み合わせます。それぞれ何を担当するかを押さえると、後述の実装コードが読み解きやすくなります。
SpeechAnalyzer(解析セッションの司令塔)
SpeechAnalyzerは解析セッション本体です。生成時に処理モジュールの配列を渡し、音声入力ストリームをstart(inputSequence:)で受け付けます。文字起こしの結果自体はモジュール側から受け取る設計で、SpeechAnalyzerは入力の受付とセッションのライフサイクル管理に専念します。
SpeechTranscriberとDictationTranscriber
SpeechTranscriberは今回の主役で、長文・連続音声向けの高精度オンデバイス文字起こしを担います。もう一つのDictationTranscriberは、キーボードの音声入力に相当する旧来型のディクテーション認識を提供するモジュールで、SpeechTranscriberが対応しないロケールや古い設定への互換パスとして使います。どちらもオンデバイスで動作します。未対応言語だからといってクラウド認識へ自動的に切り替わるわけではない点に注意してください。
SpeechDetector(音声区間の検出)
SpeechDetectorは音声ストリームの中で人の発話が含まれる区間を検出するモジュールです。無音や雑音だけの区間を除いて文字起こしを効率化したい場合に、SpeechTranscriberと組み合わせてSpeechAnalyzerへ登録します。
AssetInventory(言語モデルの管理)
AssetInventoryは言語モデル(音声認識アセット)のダウンロードとインストールを管理します。必要なロケールのモデルが未導入ならassetInstallationRequest(supporting:)で取得でき、一度ダウンロードしたモデルは端末内で複数アプリ間に共有されるため、アプリ本体のサイズを膨らませずに済みます。
SpeechAnalyzerの実装手順(Swiftコード付き)
ここからは、マイク音声をリアルタイムに文字起こしする最小構成をコードで示します。import Speechと、マイク入力を扱うためのimport AVFoundationを前提とします。ライブ録音を使う場合はInfo.plistにNSMicrophoneUsageDescription(マイク利用目的の説明)が必要です。音声ファイルを解析するだけならマイク権限は不要です。なお以下はiOS 26時点のAPIで、細部のシグネチャは更新され得るため、実装時は公式ドキュメントで最新の定義を確認してください。
1. 対応ロケールの確認とモデルのダウンロード
まず目的の言語が対応しているかを確認し、モデルが未インストールならAssetInventoryでダウンロードします。
import Speech
func prepareTranscriber(locale: Locale) async throws -> SpeechTranscriber {
// 対応ロケールか確認
let supported = await SpeechTranscriber.supportedLocales
let isSupported = supported.contains {
$0.identifier(.bcp47) == locale.identifier(.bcp47)
}
guard isSupported else { throw TranscriptionError.unsupportedLocale }
let transcriber = SpeechTranscriber(
locale: locale,
transcriptionOptions: [],
reportingOptions: [.volatileResults],
attributeOptions: [.audioTimeRange]
)
// 未インストールならモデルを取得
if let request = try await AssetInventory.assetInstallationRequest(
supporting: [transcriber]
) {
try await request.downloadAndInstall()
}
return transcriber
}
reportingOptionsに.volatileResultsを指定すると、確定前の暫定テキストも逐次受け取れます。.audioTimeRangeを付けると各認識結果に音声上のタイムスタンプが付与され、字幕や再生位置との同期に使えます。
2. SpeechAnalyzerの初期化と入力ストリームの開始
用意したSpeechTranscriberをSpeechAnalyzerに登録し、音声入力用のAsyncStreamを開始します。
let transcriber = try await prepareTranscriber(
locale: Locale(identifier: "ja-JP")
)
let analyzer = SpeechAnalyzer(modules: [transcriber])
// 入力ストリームを作成して解析を開始
let (inputSequence, inputBuilder) =
AsyncStream<AnalyzerInput>.makeStream()
try await analyzer.start(inputSequence: inputSequence)
makeStream()が返すinputBuilderへ音声バッファを流し込み、inputSequenceをSpeechAnalyzerが読み取る、という一方向のパイプを作るイメージです。
3. 音声の供給と逐次結果の受信
マイクから取得したAVAudioPCMBufferをAnalyzerInputにくるんでyieldし、結果はtranscriber.resultsをfor try awaitで回して受け取ります。
// AVAudioEngineのタップ内などでバッファを供給
let input = AnalyzerInput(buffer: pcmBuffer)
inputBuilder.yield(input)
// 別タスクで結果を購読
for try await result in transcriber.results {
let text = String(result.text.characters)
if result.isFinal {
finalText += text // 確定テキスト
} else {
volatileText = text // 暫定(volatile)テキスト
}
}
isFinalがfalseの間は認識が揺れ動く暫定結果です。画面では暫定テキストをグレー表示にし、isFinalがtrueになった時点で確定テキストへ差し替えると、変換途中の書き換わりが自然に見えます。
4. 解析セッションの確定
入力を終えるときは、ストリームを閉じるだけでは解析は止まりません。残った音声を処理して確定させるため、明示的に終了処理を呼びます。
inputBuilder.finish()
try await analyzer.finalizeAndFinishThroughEndOfInput()
finalizeAndFinishThroughEndOfInput()を呼ぶと、末尾までの音声が処理されて最終結果が確定し、セッションが安全に終了します。この呼び出しを忘れると末尾の発話が確定しないまま残るため、実装で見落としやすい箇所です。
オンデバイス処理のメリットと導入前の注意点
SpeechAnalyzerの利点は「端末内で完結すること」に集約されますが、その裏返しの制約もあります。採用判断の材料として両面を押さえておきます。
プライバシーとオフライン動作
音声データが端末外へ送信されないため、情報漏えいのリスクを構造的に減らせます。ネットワークがない環境でも動作し、機内・地下・海外ローミングなど通信が不安定な場面でも文字起こしが止まりません。
低遅延と逐次表示
クラウド往復の通信遅延がないうえ、Neural Engineでの処理と.volatileResultsによる暫定結果の即時返却により、話しながら画面に文字が出る体験を作れます。会議の同時字幕やライブ配信のリアルタイム字幕に向きます。
導入前に踏まえる制約
一方で、SpeechAnalyzerはiOS 26以降専用で後方互換がありません。iOS 18以前(iOS 26より前のOS)を切り捨てられないアプリでは、旧OS向けにSFSpeechRecognizerを残す二重実装が必要になります。また認識精度と速度は端末のNeural Engine性能に依存し、初回はロケールごとのモデルダウンロード(数百MB規模になり得る)が発生します。「全ユーザーに一律で最新機能を配りたい」「対応言語がsupportedLocalesに含まれない」といったケースでは、無理にSpeechAnalyzerへ寄せずDictationTranscriberやクラウドAPIとの併用を検討する方が現実的です。
WhisperやクラウドAPIとの比較
音声認識の選択肢としてよく比較されるのが、OpenAIのWhisperやGoogle/Azureのクラウド音声認識です。オンデバイスのWhisper実装についてはWhisperを使用したリアルタイム文字起こしの実現方法も参考になります。ここでは主要な軸で違いを整理します。
| 観点 | SpeechAnalyzer | Whisper | クラウドAPI |
|---|---|---|---|
| 実行場所 | 端末内 | 端末/サーバー | サーバー |
| ネット接続 | 不要 | 不要(ローカル) | 必須 |
| 対応ロケール数 | 約40 | 100超 | 100超 |
| 費用 | 無料(OS標準) | 無料(OSS) | 従量課金 |
| 対応OS | iOS 26以降 | 制約なし | 制約なし |
SpeechAnalyzerの「約40」はロケール単位(en_USとen_GBは別ロケール)で、言語数としてはこれより少なくなります。Whisperの100超は言語数です。またWhisperはローカル実行なら通信不要ですが、OpenAIのAudio APIとしてクラウド利用する構成もある点に注意してください。
精度と速度
AppleはSpeechAnalyzerの自社モデルが高速だとしており、第三者の実測ではWhisper Large V3 Turboと比べて約2倍速いとの報告もあります。ただしこれは特定条件下の比較で、Appleによる公式なクロスモデルベンチマークとして示された数値ではありません。英語圏では両者の精度は近く、実際の優劣は言語・音声品質・端末で変わるため、導入前に自社の音声サンプルで実測することを勧めます。
対応言語とカスタマイズ性
Whisperは100を超える言語に対応し、モデルの差し替えや追加学習といったカスタマイズも可能です。対してSpeechAnalyzerは主要言語中心の約40ロケールで、モデルはApple提供のものに固定されます。多言語対応や独自ドメイン語彙への最適化が要件なら、Whisperやクラウドサービスに優位があります。
どちらを選ぶか
iOSアプリで日本語・英語などの主要言語を扱い、プライバシーとオフライン動作・追加コストゼロを重視するならSpeechAnalyzerが第一候補です。逆に、Android含むマルチプラットフォーム対応、40言語に含まれない言語、あるいは専門用語への追加学習が必要なら、WhisperやクラウドAPIを選ぶべきです。SpeechAnalyzerを主軸にしつつ未対応言語だけクラウドで補う、といった併用も現実的な設計です。
生成AI連携と実運用シーン
SpeechAnalyzerは「リアルタイムに端末内で長文を文字化できる」特性から、次のような用途に向きます。
リアルタイム字幕・議事録・アクセシビリティ
会議や講義の同時字幕、その場で作る議事録、動画配信のライブ字幕、聴覚に障害のある人へのコミュニケーション支援などが代表例です。オフラインで動くため、通信環境を問わず現場で使えます。
Foundation ModelsやApple Intelligenceでの要約
文字起こしした結果は、Apple IntelligenceのオンデバイスFoundation Modelsに渡して要約・キーワード抽出・アクションアイテム化まで端末内で完結させられます。クラウドの生成AIと組み合わせる構成にすれば、より高度な分析も可能です。音声から議事録を生成する具体例はChatGPT Recordとは何か?音声で議事録作成が可能なChatGPTの強力な新機能を徹底解説も参考になります。
よくある質問(FAQ)
SpeechAnalyzerはどのOSから使えますか?
iOS 26/iPadOS 26/macOS 26/visionOS 26以降で利用できます。それ以前のOSには対応せず後方互換もないため、旧OSを切れないアプリではSFSpeechRecognizerとの併用が必要です。
日本語の文字起こしに対応していますか?
対応しています。日本語(ja_JP)はSpeechTranscriber.supportedLocalesに含まれ、英語・中国語・韓国語など約40ロケールが利用できます。初回はモデルのダウンロードが発生します。
SFSpeechRecognizerと何が違いますか?
約1分の時間制限の撤廃、オンライン依存の解消(オンデバイス完結)、AsyncSequenceベースのSwiftネイティブ設計が主な違いです。長時間録音の文字起こしとプライバシー保護に強くなっています。
オフラインで動きますか?利用料はかかりますか?
ネット接続なしで動作し、OS標準機能のため追加の利用料はかかりません。音声データも端末外へ送信されません。
DictationTranscriberとの使い分けは?
長文・高精度の文字起こしはSpeechTranscriber、キーボード音声入力相当のディクテーションやSpeechTranscriber非対応のロケールへの互換用途はDictationTranscriberを使います。どちらもオンデバイスで動作します。