对于实时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保存需要集成和目标设置。 本地语音识别不会描述您的应用程序执行的任何后期操作的隐私或交付行为。

相关:离线优先备忘录架构。 开发者的下一步是使用测试短语运行完整的样本,并在他们计划支持的设备和区域设置上验证准备工作、结果和停止。