對於實時iOS 26麥克風管道,請檢查裝置和區域設定支援,準備模型資產,獲取相容的PCM格式,並在輸入音訊時消耗識別結果。將正常完成與取消分開處理,以便最後一句話可以成為最終。 本指南遵循Apple的API文件和當前的SimpleMemo現場麥克風樣本;它還包括一個可單獨下載的準備助手。

從完整的樣本開始,然後檢查管道

MIT許可的儲存庫將SpeechSession暴露為iOS 26主機應用程式的Swift包。 在Xcode的軟體包依賴項下新增儲存庫,並連結SpeechAnalyzerLiveMic產品。 它的README顯示一個SwiftUI檢視,該檢視顯示finalizedText,單獨渲染volatileText,並在會話準備時禁用開始。

要獲得完整的應用程式專案,請遵循README的XcodeGen路線。 或者,將提供的應用程式源複製到新的iOS 26應用程式中。 使用一個整合路線,這樣您就不會兩次定義相同的型別。 該軟體包不實現筆記儲存、電子郵件傳送或Obsidian整合。

連結的樣本請求麥克風和語音識別授權。 其主機應用程式必須提供NSMicrophoneUsageDescription和NSSpeechRecognitionUsageDescription;新增軟體包不能提供這些主機描述。 解釋許可權的使用,顯示拒絕和準備狀態,並讓使用者選擇錄製的時限。 下面的助手沒有請求許可或啟動麥克風。

Apple的官方實時轉錄樣本和WWDC25會話是架構的有用參考。 SpeechAnalyzer座標模組;它是支援系統的附加API,不是假定所有現有的SFSpeechRecognizer程式碼都已過時的理由。

錄製前準備支援、資產和格式

SpeechTranscriber提供執行時裝置和區域設定檢查。 僅檢查iOS版本是不夠的。 以下幫助程式返回配置的轉錄器、分析器和音訊格式,或丟擲特定的準備錯誤。

下載完整的Swift準備助手。 完整的檔案包括匯入、結果和錯誤型別,以及下面討論的DictationTranscriber提示助手。 這是一個設定元件,而不是完整的錄音應用程式。

@available(iOS 26.0, *)
@MainActor
public func prepareSpeechAnalyzer(
    requestedLocale: Locale,
    naturalFormat: AVAudioFormat? = nil
) async throws -> PreparedSpeechAnalyzer {
    guard SpeechTranscriber.isAvailable else {
        throw SpeechPreparationError.deviceUnavailable
    }
    guard let locale = await SpeechTranscriber.supportedLocale(
        equivalentTo: requestedLocale
    ) else {
        throw SpeechPreparationError.unsupportedLocale
    }

    let transcriber = SpeechTranscriber(
        locale: locale,
        preset: .progressiveTranscription
    )
    // The system may already have the asset; nil means no install is needed.
    // A request can automatically reserve the locale or throw if no slot is free.
    if let request = try await AssetInventory.assetInstallationRequest(
        supporting: [transcriber]
    ) {
        try await request.downloadAndInstall()
    }
    try Task.checkCancellation()
    guard await AssetInventory.status(forModules: [transcriber]) == .installed else {
        throw SpeechPreparationError.assetsNotInstalled
    }
    guard let format = await SpeechAnalyzer.bestAvailableAudioFormat(
        compatibleWith: [transcriber], considering: naturalFormat
    ) else {
        throw SpeechPreparationError.noCompatibleFormat
    }

    let analyzer = SpeechAnalyzer(modules: [transcriber])
    try await analyzer.prepareToAnalyze(in: format)
    return PreparedSpeechAnalyzer(
        locale: locale, transcriber: transcriber,
        analyzer: analyzer, audioFormat: format
    )
}

AssetInventory管理共享系統模型。 系統或其他應用程式可能已經安裝了模型。安裝請求在不需要安裝時返回nil;否則,它可以保留區域設定並啟動下載。 預約限制也可能產生錯誤。 管理應用程式功能的預約,並在不再需要時釋出區域設定,而不是釋出應用程式中其他地方仍在使用的模型。

在下線之前,準備所需的區域設定並驗證準備情況。 模型資產在應用程式捆綁包之外,但仍然消耗系統儲存,並且可能會隨著時間的推移而變化。 在主機使用者介面中顯示下載進度和取消。 “裝置識別”並不意味著“不需要準備或網路訪問。”

以分析器接受的格式提供PCM

AVAudioEngine microphone tap
  -> owned PCM / conversion for the selected format
  -> AsyncStream<AnalyzerInput>
  -> SpeechAnalyzer + SpeechTranscriber
  -> result consumer and UI state

啟用音訊會話後,檢查輸入節點的實際格式。 不要硬編碼取樣率,因為裝置或路由以前經常使用該速率。 適當時將自然格式傳遞給bestAvailableAudioFormat(compatibleWith:considering:),並拆開其可選結果。 Apple記錄了分析儀沒有透明地重新取樣或轉換輸入。

儲存庫的AudioBufferConverter返回已匹配的緩衝區不變,並在格式不同時使用AVAudioConverter。 不匹配的格式需要轉換,而不是作為每個緩衝區的全面額外步驟。 檢查輸出幀長度並報告轉換錯誤;無聲刪除每個失敗的緩衝區可以使錄製使用者介面看起來健康,同時不產生文字。

為排隊的音訊提供明確的所有權政策。 即使格式已經匹配,更新後的樣本轉換器也會返回獨立的PCM儲存,因此以後重複使用輸入不會覆蓋排隊的音訊。 音訊回撥提供的緩衝區不得假定在回撥返回後保持不變。 如果您將其排隊供以後使用,請安排一個合適的自有副本或控制緩衝壽命的管道。 將每個緩衝區UI突變放在音訊回撥中。 對於生產,還要決定如何繫結排隊工作,並處理超載或路由更改。

在Swift 6中,捕獲區域性變數本身並不能證明管道是執行緒安全的。 當前樣本的轉換器有一個單處理執行緒合同和一個私有鎖保護的@unchecked Sendable支架,用於一個轉換器回撥。 它並不能使所有PCM緩衝區或轉換器普遍安全跨執行緒共享。 在調整樣品之前,請先閱讀該合同。

替換不穩定的結果;在最終確定之前完成輸入

啟用漸進式結果後,不穩定結果可以修改音訊範圍的文字。 不要將每個部分結果附加為新句子。 簡單的樣本保留了最終文字和可替換的易變尾部。 要進行更豐富的編輯,請將更新與音訊範圍對齊,並分別保留最終片段。 Apple 在 WWDC 會話的 結果部分 中描述了此行為。

  1. 在正常的停止操作中,停止產生新的麥克風音訊,並移除一次水龍頭。
  2. 完成AsyncStream輸入延續,以便分析器可以看到輸入的結束。
  3. 等待finalizeAndFinishThroughEndOfInput(),而結果-消費者任務仍然有效。
  4. 等待結果消耗完成,然後提交最終文字並釋出會話資源。

定稿等待輸入終止和消耗。 在製作人從未完成時打電話可以離開停止等待。 立即取消結果任務也可能丟失您打算儲存的尾部。 丟棄話語的取消操作應使用故意取消路徑,而不是假裝它是正常的最終結果。

公共包仍然是一個學習樣本。 它當前的stop()最終確定,然後取消消費者;它不會公開單獨的消費者完成確認。 如果保留每個最終結果很重要,請調整該生命週期並進行測試。 還要測試在準備過程中停止、反覆點選、檢視關閉、中斷和錯誤後重新啟動。

詞彙支援取決於轉錄模組

不能說新的 Speech API 不支援上下文詞彙。Apple 為 DictationTranscriber 提供了 AnalysisContext.contextualStrings 的文件。文件建議使用簡短短語,所有標籤下的短語總數最多為 100 個。這並不意味著同樣的提示也能用於定製 SpeechTranscriber。

// For an analyzer configured with DictationTranscriber.
let context = AnalysisContext()
context.contextualStrings[.general] = ["Obsidian", "Yurica"]
try await analyzer.setContext(context)

setContext(_:)替換了當前上下文,因此在需要時保留或合併任何現有的應用程式上下文。 可下載的助手拒絕超過100的短語,而不是默默地截斷它們。 短語提示與也為DictationTranscriber記錄的自定義語言模型選項不同,兩者都不保證正確識別每個名稱。 選擇並測試您的應用程式所需的模組和語言。

當錄音沒有產生文字時,找到失敗的階段

症狀檢查下一步有用的證據
準備失敗裝置支援、規範化區域設定、資產狀態和預約/下載錯誤作業系統和裝置、請求/選定的區域設定、錯誤域和程式碼
麥克風使用者介面處於活動狀態,沒有緩衝區許可權、音訊會話啟用、路由、引擎啟動和抽頭生命週期回撥是否到達;輸入取樣率和通道計數
緩衝器到達,沒有文字相容格式、非零轉換器輸出、輸出輸入和活動結果任務輸入/輸出幀計數和第一個實際管道錯誤
單詞重複是否附加了可變的修訂版而不是替換結果音訊範圍和最終/易失性標誌
最後的話消失最終確定期間的輸入完成和消費者壽命最後一次輸入時間、最終完成和最終結果接收
離線啟動失敗該裝置和區域設定上的所需機型就緒斷開連線前的資產狀態和表面設定錯誤

對於診斷,從階段定時、幀數、區域設定和錯誤資訊開始。 每個日誌條目都不需要原始錄音和可識別的文字。 如果使用者共享複製品,請要求提供簡短的非敏感測試短語和相關配置,而不是私人對話。

檢查了什麼,以及在裝置上測量什麼

本文在9月9、2026上根據Apple文件和Xcode 26.6進行了檢查。 可下載的助手透過了Swift 6型別檢查,並具有iOS 26模擬器目標的完全嚴格併發性。 它不會錄製音訊,並且此檢查不會顯示語音準確性、成功安裝資產或端到端麥克風會話。

修訂版1befcce的公共樣本在9月9透過了四次PCM轉換器測試和iOS模擬器構建。 兩次測試在轉換後重複使用源緩衝區,並確認單色浮點數和交錯立體整數輸出保持完好無損;兩者都與之前的匹配格式直通實現相比失敗。 它的README明確表示,軟體包重構尚未在物理iOS裝置上重新測試。 此頁面之前的歷史延遲數字不是當前軟體包的基準。

對於您自己的應用程式,記錄裝置、作業系統、區域設定、音訊路由、模型準備情況和確切的定時邊界。 分別測量第一個不穩定文字、第一個最終文字和正常停止完成。 將具有現成資產的會話與需要準備的會話進行比較。 重複一個固定的非敏感短語,並檢查缺失或重複的最後單詞以及速度。 不要從一個定時結果中推斷出神經引擎行為或硬體限制。

在Apple Watch上,如果適合您的應用程式,請使用單獨的系統文字輸入流。TextFieldLink開啟系統介面;它不會確定聽寫已經在錄製。 SpeechAnalyzer在watchOS上不可用,iOS軟體包不是Watch麥克風的實現。

常見問題

SpeechAnalyzer離線工作嗎?

SpeechTranscriber在裝置上處理音訊,但其所需的型號必須可用。 資產可能在您的應用程式首次啟動之前就已經存在。 在離線會話之前檢查並準備它們;不要假設每次首次啟動都必須下載,或者之前安裝的模型將始終可用。

我可以新增自定義詞彙嗎?

Apple文件AnalysisContext.contextualStrings for DictationTranscriber,該模組還公開了自定義語言內容提示。 這不是SpeechTranscriber的相同功能的文件。 仔細選擇模組,並測試您需要的單詞和區域設定。

為什麼應用程式會錄製,但沒有顯示文字?

檢查裝置和區域支援、資產狀態、麥克風輸入、可選分析儀格式、轉換器輸出、輸入序列和結果消費者。 顯示實際錯誤,而不是將每個空結果視為格式問題。

停止時如何保留最後一句話?

停止產生音訊,完成輸入延續,讓分析器完成輸入結束。 讓結果消費者保持活力,以接收最終結果。 取消是一個單獨的丟棄路徑,而不是替代正常完成。

這個樣本在Apple Watch上執行嗎?

編號。 連結的麥克風會話是iOS 26示例,SpeechAnalyzer在watchOS上不可用。 Watch應用程式可以使用系統文字輸入,例如TextFieldLink;它呈現了一個系統輸入介面,但並不證明聽寫錄音已經開始。

樣品的驗證是什麼?

連結的儲存庫在9月9、2026上記錄了四個轉換器測試和iOS模擬器構建,包括兩個重複使用源緩衝儲存的迴歸。 沒有要求進行物理裝置重新測試。 本指南的準備助手在9月9使用Swift 6完全嚴格併發模式中的Xcode 26.6進行了型別檢查。 這些檢查不會確定麥克風的準確性、模型下載行為或延遲。

這與Simple Memo有什麼關係

本指南和免費樣品由SimpleMemo開發人員維護。 應用的語音輸入指南描述了產品工作流程。 樣本本身不傳送電子郵件,也不向Obsidian儲存任何東西。 在Simple Memo中,電子郵件需要收件人設定和驗證,Obsidian儲存需要整合和目標設定。 本地語音識別不會描述您的應用程式執行的任何後期操作的隱私或交付行為。

相關:離線優先備忘錄架構。 開發者的下一步是使用測試短語執行完整的樣本,並在他們計劃支援的裝置和區域設定上驗證準備工作、結果和停止。