◉RORK LABEN
●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…
記事一覧/AIモデル
◉ AIモデル/2026-07-01上級

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

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

SpeechAnalyzerRork Max236音声認識4iOS115オンデバイスAI13

✦ プレミアム記事

音声を録りためた日記アプリを個人開発で触っていたとき、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-05-05
Rork Max で AI 面接コーチアプリを作る:音声録音・Claude 評価・進捗管理の実装ガイド
Rork Maxで音声録音、Whisperによる文字起こし、Claude APIでの回答評価を組み合わせたAI面接コーチアプリを構築します。Cloudflare Workersでの評価API実装、セッション管理と進捗トラッキング、フリーミアム課金設計、本番環境の注意点まで一気通貫で扱います。
◉ AI モデル2026-09-12
iOS 27 の新機能を Rork に頼むと、エラーにならないまま古い書き方へ戻ります
9月14日に iOS 27 が配信されます。生成 AI が知らない API を頼まれたときには、落ちる失敗と落ちない失敗の二種類が起きます。標準 Rork と Rork Max で性質が違う理由と、返ってきたコードを確かめる三つの順番を整理しました。
◉ AI モデル2026-06-24
Rork Max の AI 機能を本気で使い倒す — Vibe Coding を超える実装力の引き出し方
Rork Max を実装パートナーとして使い倒すための深掘りガイドです。プロンプト設計とコンテキスト管理に加え、無印 Rork と Rork Max の選び分け、クレジットを無駄にしない作り方、App Store 提出前の検証までを、個人開発の実体験からまとめました。