はじめに
こんにちは!2025年4月にSansanに中途入社し、技術本部 Sansan Engineering Unit Mobile Application GroupでiOSエンジニアとして開発に携わっているヤズジュ夢佐です。
Sansan iOSアプリは、2025年の年末にアプリを開いて録音を開始するだけで、商談中の会話を自動で文字起こしし、AIが要点を整理して商談記録を作成してくれる機能をリリースしました。 こちらの機能には、iOS 26で登場したAI音声認識技術であるSpeechAnalyzerを用いて、音声からの文字起こし処理を実現しています。この記事では、SpeechAnalyzerの技術的な内容や実装詳細、iOS 18以下でも使用可能であるSFSpeechRecognizerによる文字起こしとの比較や、実体験に基づく、事前調査では分からなかった、SpeechAnalyzerを扱う際に注意すべき落とし穴について紹介します。
こちらの機能の詳しい内容については、弊社のプレスリリースに詳しく書かれているので、参照していただければ幸いです。
SFSpeechRecognizer
まず、iOS 26で登場したSpeechAnalyzerについて解説する前に、それ以前のiOS18以下で使用可能だった、SFSpeechRecognizerという文字起こしに使用可能な技術について紹介させてください。
SFSpeechRecognizerは、2016年にiOS10で登場しました。当時はSiriを支えていた音声認識技術です。
リアルタイムのストリーミング形式での音声認識はSFSpeechAudioBufferRecognitionRequestによって行うことができ、
音声ファイルからの一括での音声認識もSFSpeechURLRecognitionRequestによって可能となっています。
詳しい内容は、こちらのWWDC16の動画をご覧ください。
SFSpeechRecognizerが登場した当時は、クラウドベースの音声認識処理のみをサポートしていました。 しかし、2019年のiOS13の登場と共に、オンデバイスでも音声認識を行えるように進化しています。
これによって、iOS13以降では、requiresOnDeviceRecognitionというpropertyをtrueにすることで、
SFSpeechRecognizerにオンデバイス処理を強制できるようになりました。
さらに、それまでのクラウドベースの音声認識処理で存在していた最大1分までという時間制限も、オンデバイス処理では無くなっています。
しかし、このSFSpeechRecognizerをアプリに組み込む場合、その機能を利用するユーザーは、設定アプリの一般 > キーボード > 音声入力を有効にするを手動で有効に切り替える必要があるという欠点も存在していました。
さて、ここまでざっくりとSFSpeechRecognizerの能力について紹介してきましたが、この技術と比較して、SpeechAnalyzerはどんな内容になっているのか、見ていきましょう。
SpeechAnalyzer
SpeechAnalyzerは、iOS 26でSpeech Frameworkに新たに導入されました。 iOS18以降では、iOS純正のメモ、ボイスメモ、ジャーナルなどのアプリにも使われています。
SpeechAnalyzerのSFSpeechRecognizerと比較した主な特徴は次の通りです。
- SFSpeechRecognizerはオンデバイス・クラウド両方対応していたのに対し、SpeechAnalyzerはオンデバイスのみ
- SFSpeechRecognizerでは拾いづらかった遠距離から聞こえてくる音声にも対応し、音を拾う感度が大幅に向上
- SFSpeechRecognizerで必要だった、設定アプリでの
一般 > キーボード > 音声入力を有効にするを有効に切り替える必要がない
SpeechAnalyzerの詳細については、次のWWDC25の動画がおすすめです。
SpeechAnalyzerにはApple公式のサンプルアプリも用意されているため、手元で動かしたい方はぜひこちらから触ってみてください。
文字起こし処理の実装
SpeechAnalyzerの概要についてざっくりと紹介しました。ここからは、音声の文字起こし処理の実装方法について紹介していきます。
1. AIモデルのダウンロード
文字起こし処理は端末上でローカルに行われるため、まずは文字起こしを行うためのAIモデルを端末に用意する必要があります。 SpeechAnalyzerの文字起こしに使われるモデルは、特定のアプリに限定されないシステムレベルのディレクトリであるAssetInventoryにて管理され、自動でインストール・アップデートが行われるようになっています。
そのため、もし他のアプリがすでにSpeechAnalyzerのインストールを済ませていたり、OSが前もってインストールをしてくれている場合は、ユーザーはインストール処理を待つことなくすぐに文字起こし機能を使うことができます。
しかし、インストールされていない場合も存在するので、事前にインストールされているかどうかチェックし、されていない場合はインストール処理を呼び出す必要があります。インストールされているかどうかは、installedLocalesに対象のlocaleが存在するかどうかで確かめることができます。
インストール処理の実装例は次の通りです。
@available(iOS 26, *) private func downloadLocaleIfNeeded(_ locale: Locale) async throws { // Localeがinstallされているかチェック if await SpeechTranscriber.installedLocales.contains(locale) { return } // installされていない場合はinstallする let transcriber = SpeechTranscriber(locale: locale, preset: .transcription) do { if let downloader = try await AssetInventory.assetInstallationRequest(supporting: [transcriber]) { try await downloader.downloadAndInstall() } } catch { // エラーハンドリングを記載 } }
2. 文字起こし処理の実装
SpeechAnalyzerの文字起こしの結果はAsyncSequence形式で返されるため、for try await in ループの中で非同期で受け取ることが可能で、実装コードも非常にシンプルな形に収まります。
こちらはApple公式のサンプルアプリから抜粋した文字起こし処理に関する実装コードです。こちらのアプリでは、録音中にリアルタイムで文字起こしが行われ、その結果がリアルタイムで画面上に描画されています。
for try await case let result in transcriber.results { let text = result.text if result.isFinal { finalizedTranscript += text volatileTranscript = "" updateStoryWithNewText(withFinal: text) } else { volatileTranscript = text volatileTranscript.foregroundColor = .purple.opacity(0.4) } }
文字起こしの結果として、isFinalの値がtrueのものとfalseのものが存在します。falseのものは、暫定結果として素早く生成される文字起こし結果です。trueのものは、前後の文脈も考慮した上で決定された、確定版の文字起こし結果になります。
録音中のリアルタイムの文字起こしではなく、用意された音声ファイルから一括で文字起こしを行う場合は次のような形で実装が可能です。
import Speech import Foundation struct SpeechTranscription: Sendable { func transcribe(_ fileURL: URL) async throws -> String { let transcriber = SpeechTranscriber(locale: Locale(identifier: "ja-JP"), preset: .transcription) let analyzer = SpeechAnalyzer(modules: [transcriber]) let audioFile = try AVAudioFile(forReading: fileURL) if let lastSample = try await analyzer.analyzeSequence(from: audioFile) { try await analyzer.finalizeAndFinish(through: lastSample) } var transcriptionResult = "" for try await result in transcriber.results { transcriptionResult += String(result.text.characters) } return transcriptionResult } }
リアルタイムの文字起こしと同じく、ループ処理を通じて音声が文字起こし処理にかけられ、LLMのように少しずつ文章が生成されます。
文字起こし精度の比較
SFSpeechRecognizerも、SpeechAnalyzerも、どちらもローカルでの音声ファイルからの文字起こしに対応しています。
そのため、 全く同じ音声ファイルを、全く同じiOS端末上でSFSpeechRecognizerとSpeechAnalyzerの文字起こし処理に通すことによって、精度を正確に比較できます。
検証用に用意した、20分程度の実際に行われた会議の音声ファイルを用意し、2つの文字起こし技術でどのような結果が返ってくるか比較しました。その結果は次の通りです。
SpeechAnalyzer: 5270文字検出SFSpeechRecognizer: 1896文字検出
音の拾いやすさ、検出の細かさが圧倒的にSpeechAnalyzerの方が上であり、その能力差は数字で見ても一目瞭然です。上記は一例ですが、他の音声ファイルでも似たような結果を得ることができました。文字起こしの細かさだけでなく、生成された文章の精度についてもSpeechAnalyzerの方が高いです。一方で、SFSpeechRecognizerの文字起こし結果からは、会話の多くの要素が抜け落ちており、精度も劣るものでした。
SpeechAnalyzerの注意すべき落とし穴
ここからは、SpeechAnalyzerを使った文字起こし機能を実装するうえで、事前調査ではなく実装中に発見したいくつかの落とし穴について紹介していきます。
落とし穴1: すべてのiOS 26以上の端末で使うことができるわけではない
実は、SpeechAnalyzerはiOS 26のすべての端末で利用できるわけではありません。SpeechAnalyzerは、SpeechTranscriberというモジュールを使用して文字起こし処理を行いますが、このSpeechTranscriberにはisAvailableというpropertyが存在します。
公式ドキュメントには、このような説明があります。
isAvailable: A Boolean value that indicates whether this module is available given the device’s hardware and capabilities.
つまり、一部のhardwareはiOS 26でもSpeechTranscriberを扱う能力が無く、使用不可となります。 実際に検証した結果、iPhone 11, iPhone 11 Pro, iPhone 11 Pro Max, iPhone SE第二世代は、iOS 26対応モデルであるにも関わらず、SpeechAnalyzerを使用できないことがわかっています。iPadでも、iOS 26対応モデルであるにも関わらずSpeechAnalyzerを使用できないモデルが存在します。
SpeechTranscriberが使える端末と使えない端末について、Apple公式からの明確な言及はされていませんが、調査の結果、搭載されているNeural Engineのコア数が関係しているのではないかと推測しています。
- 8-core Neural Engineを搭載しているモデルはSpeechTranscriberをサポートしていない
- 16-core Neural Engineを搭載しているモデルはSpeechTranscriberをサポートしている
こちらのDeveloper Forumでも同じ報告がされています。
モデルごとのコア数については、Apple公式のモデル比較ページから確認できます。
落とし穴2: リアルタイムの文字起こしでは、音を拾う感度が致命的に悪い
この記事では、録音中のリアルタイムの文字起こし、音声ファイルからの文字起こし、どちらの実装も紹介しました。 どちらの実装もAsyncSequenceによってforループを通して行われる、ほとんど同じようなコードです。
ただ、録音中のリアルタイムの文字起こしは音の拾いやすさが致命的に悪いということが、検証する中でわかりました。 自分がiPhoneに向かって話している場合はほぼ漏れなく音を拾いますが、机の向こう側に座っている人の声さえ取ることができません。 マイクの指向性を変更したり、AudioSessionを切り替えていろいろなモードで検証したりしましたが、この現象を改善できませんでした。
録音中にリアルタイムで文字起こし処理に通すのではなく、音声の録音を完了してから音声ファイルに起こし、その音声ファイルを文字起こし処理に通すことで、音の拾いやすさが劇的に改善することがわかっています。
体感として、録音中のリアルタイムの文字起こしをしているときのSpeechAnalyzerの音の拾いやすさは、SFSpeechRecognizerに近いと感じています。
まとめ
SpeechAnalyzerは、多くの制限はありつつも非常に優秀な文字起こし技術です。現状はまだまだiOS 26以上のシェアも小さく、SpeechAnalyzerが使えない端末のシェアもある程度大きい状況です。しかし、将来的にiOS 26以上の端末・SpeechAnalyzerの対応端末のシェアが拡大していくことは確実です。その点も踏まえた上で、将来性を見越した場合、SpeechAnalyzerは強力な選択肢になります。Swift Concurrencyに対応しており実装も手軽にできる上、Apple公式のサンプルプロジェクトも用意されているので、興味のある方はぜひ使ってみてください。