RORK LABEN
MAX — Rork MaxがネイティブSwiftアプリを生成し、iPhone・iPad・Watch・TV・Vision Pro・iMessageに対応しますNATIVE — AR/LiDAR、Metalによる3D、Dynamic Island、Live Activities、HealthKit、Core MLなどに手が届きますPUBLISH — 2クリックでApp Storeへ提出でき、申請まわりの手間が大きく圧縮されていますPRICING — Rork Maxは月200ドル、元のRorkは無料で始められ有料は月25ドルからですFUNDING — Rorkがa16zから280万ドルを調達し、月間74万超の訪問・成長率85%と紹介されていますTOOL — 元のRorkはReact Native(Expo)でiOSとAndroidのアプリを自然言語から生成しますMAX — Rork MaxがネイティブSwiftアプリを生成し、iPhone・iPad・Watch・TV・Vision Pro・iMessageに対応しますNATIVE — AR/LiDAR、Metalによる3D、Dynamic Island、Live Activities、HealthKit、Core MLなどに手が届きますPUBLISH — 2クリックでApp Storeへ提出でき、申請まわりの手間が大きく圧縮されていますPRICING — Rork Maxは月200ドル、元のRorkは無料で始められ有料は月25ドルからですFUNDING — Rorkがa16zから280万ドルを調達し、月間74万超の訪問・成長率85%と紹介されていますTOOL — 元のRorkはReact Native(Expo)でiOSとAndroidのアプリを自然言語から生成します
記事一覧/AIモデル
AIモデル/2026-07-01上級

Rork Max のネイティブ Swift で SpeechAnalyzer を使い、長尺の音声を端末内で文字起こしする

SFSpeechRecognizer では詰まっていた長尺・オフラインの文字起こしを、iOS 26 の SpeechAnalyzer と SpeechTranscriber で作り直す実装メモです。モデル資産のダウンロード、AsyncStream での音声供給、確定前と確定後の結果の扱い分け、Rork Max のネイティブ生成と Expo からの橋渡しの境界設計まで、実際にハマった点を添えてまとめます。

SpeechAnalyzerRork Max199音声認識4iOS92オンデバイスAI12

プレミアム記事

音声を録りためた日記アプリを個人開発で触っていたとき、1 分を超える録音の文字起こしがどうしても安定しませんでした。当時使っていた SFSpeechRecognizer は、オンデバイス指定にしても実質 1 分前後で切れてしまい、長い独り言をそのまま流し込むと途中で結果が返らなくなります。かといってサーバー送りにすると、日記という題材ではプライバシーが気になりますし、電波の弱い場所では待たされます。私自身、この「長尺・オフライン・プライバシー」の三点をどれも譲れないまま、しばらく実装を寝かせていました。

iOS 26 で登場した SpeechAnalyzer は、この三点を正面から解いてくれます。長尺の音声を端末内で、しかもクラウドに一切送らずに文字起こしできる、新しい設計の API です。Rork Max がネイティブ Swift を生成するようになったことで、この API を個人開発の小さなアプリにも現実的に組み込めるようになりました。実際に日記アプリへ移植して分かったことを、順を追ってまとめます。

SFSpeechRecognizer から何が変わったのか

まず、両者の性格の違いを整理しておきます。ここを取り違えると、せっかくの移植が「動くけれど遅い」ものになりがちです。

観点SFSpeechRecognizerSpeechAnalyzer(iOS 26)
想定する長さ短い発話・コマンド向き会議や口述など長尺向き
処理場所オンデバイス指定は可能だが制約が残る資産を入れれば端末内で完結
API の形デリゲート+リクエストSwift Concurrency(AsyncSequence)
モデル管理OS 任せで不透明言語資産を明示的にダウンロード・管理
構成ほぼ一体モジュールを付け外しする分析セッション

要点は、SpeechAnalyzer が「分析セッションに、目的別のモジュールを取り付ける」という組み立て方になったことです。文字起こしをしたいなら SpeechTranscriber を、発話区間の検出をしたいなら SpeechDetector を取り付けます。取り付けた時点より後の音声だけをそのモジュールが処理するので、途中から機能を足す設計も素直に書けます。

なお、対応プラットフォームは iOS 26・iPadOS 26・macOS 26・visionOS 26・tvOS 26 で、現行 SDK では watchOS では利用できません。Apple Watch 側で録って本体で解析する、といった役割分担を最初に決めておくと後で困りません。

モデル資産の有無を確かめ、必要なら取り寄せる

SpeechTranscriber は言語ごとのモデル資産を使います。この資産は端末に最初から入っているとは限らないため、実行前に「その言語が使えるか」「資産が手元にあるか」を確認し、なければダウンロードします。ここを省くと、初回起動時だけ無言で失敗する、という再現しづらい不具合になります。私自身、最初はこの確認を飛ばしていて、実機の初回だけ結果が空になる現象に半日ほど悩まされました。

以下は、指定したロケールが対応済みかを調べ、未取得ならダウンロードを待つところまでの最小構成です。

import Speech
 
/// 文字起こしに使うロケールの資産を用意する。
/// 戻り値の Bool は「このロケールで文字起こしを開始してよいか」を表す。
func ensureTranscriberAssets(for locale: Locale) async throws -> Bool {
    // 1. そもそもこのロケールが SpeechTranscriber の対象か
    let supported = await SpeechTranscriber.supportedLocales
    guard supported.contains(where: { $0.identifier(.bcp47) == locale.identifier(.bcp47) }) else {
        return false
    }
 
    // 2. 端末に資産が入っているか
    let installed = await SpeechTranscriber.installedLocales
    if installed.contains(where: { $0.identifier(.bcp47) == locale.identifier(.bcp47) }) {
        return true
    }
 
    // 3. 入っていなければ、必要な資産のダウンロードを依頼して完了を待つ
    let transcriber = SpeechTranscriber(locale: locale, preset: .progressiveLiveTranscription)
    if let request = try await AssetInventory.assetInstallationRequest(supporting: [transcriber]) {
        try await request.downloadAndInstall()
    }
    return true
}

preset: には用途に合ったものを選びます。ライブで逐次表示したいなら progressiveLiveTranscription のように、確定前の暫定結果を積極的に返す設定が向いています。録り終えた音声をまとめて処理するなら、確定結果だけを重視するプリセットのほうが、画面のちらつきを避けられます。

ダウンロードは通信量を伴うので、Wi‑Fi 時に先回りで取り寄せる、設定画面で明示的に「日本語の音声認識を有効化」させる、といった導線をアプリ側で用意しておくと親切です。私の場合は、初回オンボーディングの最後にこのダウンロードを走らせ、進捗をプログレスバーで見せるようにして、体感の不安を減らしました。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
SFSpeechRecognizer の 1 分制限やクラウド往復といった制約を、iOS 26 の SpeechAnalyzer がどう解消するか、置き換えの判断基準が分かります
モデル資産の確認とダウンロードから、AsyncStream での音声供給、確定前(volatile)と確定後(final)の結果の描き分けまでの、動く Swift コード一式が手に入ります
Rork Max が生成するネイティブ Swift で SpeechAnalyzer を使う手順と、Expo / React Native からネイティブモジュールで橋渡しする際の境界設計が身につきます
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

AI モデル2026-06-30
Rork のハイブリッドAIが知らぬ間にクラウドへ偏って課金が膨らんでいたとき — 経路選択を計測して切り分ける運用メモ
オンデバイス・エッジ・クラウドを振り分けるAIルーターは、判断ログが無いと静かにクラウドへ偏り、トラフィックが横ばいでも課金だけが伸びます。経路選択を計測して原因を切り分けた運用メモです。
AI モデル2026-06-24
Foundation Models の Guided Generation で、オンデバイスAIの出力を型で受け取る
オンデバイスのFoundation Modelsで、AIの返答を自由文ではなく型付きの構造体として受け取る方法を、Guided GenerationとTool Callingの実装コードとともに整理します。
AI モデル2026-06-23
Rork Max のアプリで iOS 18 のオンデバイス翻訳を使う — 無料・オフラインで多言語ユーザーに応える
iOS 18 の Translation フレームワークを使い、Rork Max が生成した Swift アプリに無料・オフラインのリアルタイム翻訳を組み込む手順です。言語モデルの在庫確認、一括翻訳、空応答の回避まで実コードでまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →