杰理 SDK 文档中心
首页
首页
  • 概述与快速开始

    • 仓库概览
    • 运行环境与 SDK 集成
    • 工程结构与目录导航
  • 核心 SDK 架构

    • SDK 库体系与模块划分
    • 蓝牙连接与 RCSP 协议
    • 广播包解析与设备认证
    • 日志助手与调试支持
  • 设备功能模块

    • OTA 固件升级
    • 表盘管理与自定义表盘
    • 图像转换工具
    • 资源打包
    • 音频编解码
    • 健康与运动数据同步
    • 消息通知与实用设备功能
  • 宜动健康示例应用

    • 应用架构与页面导航
    • 健康界面与数据可视化
    • 设备连接与数据同步
    • 登录注册与用户中心
    • AI 云服务与语音交互
    • 本地数据库与持久化
    • 多语言国际化
  • 测试与调试

    • SDKTestHelper 功能测试工具
    • 音频编解码示例工程
    • 调试技巧与问题排查
  • 文档与资源

    • 在线文档与版本历史
    • 第三方框架与依赖管理

AI 云服务与语音交互

本文档介绍 JL Health(JieliJianKang)iOS 应用中「AI 云服务」与语音交互相关能力的实现:包括 AI 云服务提示入口视图、本地化文案处理,以及与语音/音频交互相关的工具组件(JLAudioToolbox)及其在整体架构中的位置。

Purpose and Scope

本页面聚焦于「AI 云服务与语音交互」这一子系统能力,覆盖以下内容:

  • AI 云服务在 App 内的展示入口与提示交互(AIServiceTipsView)
  • 提示文案的多语言本地化机制(LanguageCls)
  • 与语音交互相关的音频处理工具链(JLAudioToolbox / AudioManager)
  • 该能力与设备 SDK、主界面之间的调用关系

以下相关主题属于兄弟页面,不在本页展开:表盘市场(Dial Market)、设备配对与鉴权流程、基础 HTTP 客户端封装(httpClient)、以及 WebView 容器页面(WebViewControllers)。如需了解这些能力,请参阅对应目录项页面。

说明:本次文档基于有限的源码检索预算(6 次工具调用)完成。AI 云服务内部完整的协议交互细节(如 AI 服务端请求/响应模型、语音识别与合成的底层 SDK 调用)未能在本次检索中完全呈现,文中会明确标注证据边界。

Overview

「AI 云服务」是 JL Health 面向智能穿戴设备提供的一项云端智能能力,通常表现为设备侧的 AI 助手(如语音问答、健康建议等)。在 iOS 端,App 承担以下职责:

  1. 入口与提示:在合适的时机(如首次进入相关功能、AI 服务状态变化时)向用户展示「AI 云服务」提示窗口,说明服务能力与使用方式。
  2. 本地化:所有提示文案通过 LanguageCls.localizableTxt(_:) 统一取词,支持中英文等多语言切换,并监听语言变更事件实时刷新界面。
  3. 语音/音频链路:语音交互依赖音频采集与播放能力,仓库中的 JLAudioToolbox 工具集(AudioManager)为语音数据流提供底层支持。
  4. 设备协同:AI 云服务的实际对话与推理发生在云端或设备端,App 通过 JL SDK 与设备建立连接、透传指令与音频数据。

关键概念:

  • AIServiceTipsView:AI 云服务的提示窗视图,承载服务说明文案与交互入口。
  • LanguageCls:全局本地化工具类,负责根据当前语言环境返回对应文案,并在语言切换时发出通知。
  • JLAudioToolbox / AudioManager:音频工具箱,封装录音、播放等音频会话能力,是语音交互的音频基础设施。

Architecture

下图基于已检索到的源码证据,展示 AI 云服务与语音交互在 App 内的组件关系:

flowchart TD
    subgraph sg_UI["UI 层 (Views)"]
        AIServiceTipsView["AIServiceTipsView<br/>AI 云服务提示窗"]
    end

    subgraph sg_Service["服务与工具层"]
        LanguageCls["LanguageCls<br/>本地化工具"]
        AudioManager["AudioManager<br/>JLAudioToolbox 音频工具"]
    end

    subgraph sg_Device["设备协同层"]
        JLSdk["JL SDK / 设备连接"]
        Device["智能穿戴设备<br/>AI 助手"]
    end

    subgraph sg_Cloud["云端"]
        AICloud["AI 云服务<br/>推理/语音处理"]
    end

    AIServiceTipsView -->|"localizableTxt(\"AI云服务\")"| LanguageCls
    AIServiceTipsView -->|"语言切换刷新"| LanguageCls
    AudioManager -->|"音频数据流"| JLSdk
    JLSdk --> Device
    Device -->|"语音上行/结果下发"| AICloud

组件职责说明:

  • AIServiceTipsView:位于 Views/WindowTipsViews/ 目录,是 AI 云服务在 App 内的可见入口。其核心行为是在初始化与语言变更时,通过 LanguageCls.localizableTxt("AI云服务") 设置提示文案。
  • LanguageCls:全局本地化门面。所有面向用户的 AI 服务文案统一经由它取词,保证语言切换后 UI 实时更新(languageChange() 即响应这一事件)。
  • AudioManager(JLAudioToolbox):语音交互的音频基础。语音指令的采集、播放等音频会话能力由其管理,音频数据经由 JL SDK 与设备/云端交互。
  • JL SDK 与设备:负责承载 AI 助手的实际运行,App 侧通过 SDK 透传语音数据并接收 AI 结果;云端执行语音识别、语义理解与内容生成。

证据边界:上图中 AudioManager 与 JLSdk、AICloud 之间的连线为基于目录结构与 JL 系列 SDK 架构的推断;本次检索直接确认的代码证据为 AIServiceTipsView 对 LanguageCls.localizableTxt("AI云服务") 的调用(AIServiceTipsView.swift)以及 JLAudioToolbox/AudioManager.swift 文件的存在。

主要实现分析

AI 云服务提示窗(AIServiceTipsView)

AIServiceTipsView 位于 code/JL_Health/JieliJianKang/Views/WindowTipsViews/,与仓库中其他 *TipsView(窗口提示视图)同级,属于 App 的「窗口提示」组件族。该类承担 AI 云服务的用户告知职责:当用户首次接触或需要了解 AI 云服务时,App 以浮动提示窗形式展示服务说明。

其实现要点(依据检索到的源码片段):

  • 文案取词:提示文本通过 LanguageCls.localizableTxt("AI云服务") 获取,而非硬编码字符串。这保证了文案随 App 语言环境(简体中文 / English)自动切换。
  • 语言变更响应:类中实现了 languageChange() 方法,在语言切换时重新设置 tipsLabel.text,确保已展示的提示窗也能即时刷新文案,避免出现「界面语言已切换、提示仍为旧语言」的不一致问题。
  • 自适应布局:提示标签启用了 adjustsFontSizeToFitWidth = true,当设备宽度较窄或文案较长时自动缩小字号,保证完整展示,避免截断。

本地化机制(LanguageCls)

LanguageCls 是全局本地化工具类,是 AI 云服务文案与所有业务文案的统一出口。localizableTxt(_:) 方法以键名(如 "AI云服务"、"AI info helper")查表返回当前语言环境下的译文。

仓库中由 R.swift 生成的本地化资源(R.generated.swift)确认存在 "AI info helper" 键,且同时提供 en 与 zh-Hans 两个 locale 的译文——这直接印证了 AI 云服务相关文案是双语言资源的一部分。

设计意图:将文案集中到 Localizable 资源表,而非散落在业务代码中,使得:

  1. 新增语言(如繁体中文)无需改动业务代码;
  2. 运营/产品可独立维护文案,不触碰代码逻辑;
  3. 语言切换时可通过统一的通知机制(如 languageChange() 所响应的通知)批量刷新界面。

语音交互的音频基础(JLAudioToolbox / AudioManager)

code/JL_Health/JieliJianKang/Utilities/JLAudioToolbox/AudioManager.swift 表明仓库将音频能力独立为工具箱组件。在「AI 云服务与语音交互」的语境下,该组件是语音链路的底层支撑:语音指令采集(麦克风录音)、提示音/语音回复播放等音频会话操作均在此类组件中封装。

这类设计将音频会话(AVAudioSession)配置、录音/播放管理从业务控制器中剥离,使 AI 对话页面与设备控制页面共享同一套经过验证的音频处理逻辑,避免各页面重复实现带来的会话冲突(例如录音与播放抢占音频会话)。

核心交互流程

以下时序图展示用户触发 AI 云服务提示到语音交互建立的完整链路(图中 AIServiceTipsView 与 LanguageCls 环节有直接源码证据,其余环节为基于架构的推断):

sequenceDiagram
    participant U as 用户
    participant V as AIServiceTipsView
    participant L as LanguageCls
    participant A as AudioManager (JLAudioToolbox)
    participant D as JL SDK / 设备

    U->>V: 进入 AI 云服务场景
    V->>L: localizableTxt("AI云服务")
    L-->>V: 当前语言文案
    V-->>U: 展示提示窗
    Note over V,L: 语言切换时触发 languageChange() 刷新文案
    U->>A: 发起语音指令
    A->>D: 音频数据流上行
    D-->>A: AI 结果/语音下发
    A-->>U: 播放/展示结果

流程要点:

  1. 提示阶段:视图向 LanguageCls 取词并展示,此阶段代码已被源码证实。
  2. 交互阶段:用户语音指令经 AudioManager 采集,通过 JL SDK 与设备交互,设备侧的 AI 助手与云端完成语音识别与内容生成后回传结果。
  3. 刷新阶段:languageChange() 保证提示文案在语言切换后同步更新。

使用示例

示例一:AI 云服务提示文案设置(取词)

以下代码摘自 AIServiceTipsView,展示如何通过 LanguageCls 获取 AI 云服务文案:

tipsLabel.text = LanguageCls.localizableTxt("AI云服务")

Source: AIServiceTipsView.swift

示例二:语言切换时的文案刷新

func languageChange() {
    tipsLabel.text = LanguageCls.localizableTxt("AI云服务")
}

Source: AIServiceTipsView.swift

设计意图解读:languageChange() 被语言切换通知触发后重新取词,是「文案与语言状态解耦」的标准做法——视图不缓存文案,而是每次从 LanguageCls 读取,保证单一数据源。adjustsFontSizeToFitWidth 则处理了小屏设备与长文案的边界场景。

配置选项

AI 云服务与语音交互相关配置主要体现在本地化资源与音频工具箱层面:

配置项类型默认值说明
本地化键 "AI云服务"字符串资源随语言环境提示窗主标题/说明文案,由 LanguageCls.localizableTxt(_:) 解析
本地化键 "AI info helper"字符串资源"AI info helper"(en)/ 对应简体中文AI 服务辅助说明文案,双语言资源由 R.swift 生成(R.generated.swift)
tipsLabel.adjustsFontSizeToFitWidthBooltrue提示标签自适应字号,防止长文案截断
音频会话(AVAudioSession)配置运行时配置由 AudioManager 管理录音/播放会话的类别与路由,语音交互的基础前提

说明:AI 云服务是否启用、服务端地址等运行时开关可能由服务端下发或设备端固件决定,相关配置项未在本次检索范围内出现,故不在此列。

故障模式、边界情况与并发

依据已收集的源码证据,可确认或推断以下边界情况:

  • 语言切换竞态:languageChange() 在语言变更通知后重新设置 tipsLabel.text。若通知在视图未加载完成时触发,需要确保 tipsLabel 已初始化(languageChange() 中直接访问 tipsLabel,因此该方法的调用时机应晚于视图布局完成)。
  • 文案超长/屏宽不足:通过 adjustsFontSizeToFitWidth 兜底,但极端情况下字号过小可能影响可读性——这是该方案在「不换行完整展示」与「可读性」之间的权衡。
  • 音频会话冲突:语音交互中录音与播放共用音频会话,若 AI 对话页面与其他功能(如闹钟响铃、通话)并发操作音频,可能出现会话抢占。将音频逻辑收敛到 AudioManager(JLAudioToolbox)正是为了集中处理这类冲突,避免各页面各自配置会话导致状态混乱。
  • 设备断连:语音数据流依赖 JL SDK 与设备的连接;设备断开时语音指令无法上行,App 侧应有对应的提示与降级路径(具体实现未在本次检索中确认)。

性能与运维注意事项

  • 取词开销:LanguageCls.localizableTxt(_:) 每次调用都查表,但在提示窗等低频 UI 场景下开销可忽略;若在列表高频渲染中使用,建议做缓存或使用 R.swift 生成的强类型资源。
  • 音频链路:语音实时性取决于设备连接质量与云端推理耗时,AudioManager 层应合理配置缓冲区与采样率(相关参数未在本次检索中确认)。
  • 本地化资源维护:新增 AI 服务文案时,需同步维护 en 与 zh-Hans 两个 locale,R.swift 会在编译期生成强类型引用,可较早发现缺词问题。

扩展点

  • 新增 AI 服务提示场景:参照 AIServiceTipsView 的模式,在 WindowTipsViews 目录下创建新的提示视图,统一复用 LanguageCls 取词与 languageChange() 刷新机制。
  • 扩展语音能力:JLAudioToolbox 作为独立工具箱,可在此基础上增加语音识别结果解析、语音唤醒等模块,保持与业务层解耦。
  • 文案资源扩展:新增语言包只需在 Localizable 资源表中增加 locale 文件,无需改动 AIServiceTipsView 业务代码。

测试情况

本次检索未在源码中发现针对 AIServiceTipsView 或 AudioManager 的独立单元测试文件。仓库中的测试辅助工程(SDKTestHelper、JLAudioUnitKitDemo)主要用于 SDK 能力的集成验证。建议覆盖以下测试点:

  • localizableTxt("AI云服务") 在 en / zh-Hans 环境下返回不同且正确的译文;
  • 触发语言切换后 AIServiceTipsView 文案同步更新;
  • AudioManager 在录音/播放切换时音频会话状态正确流转。

Related Links

  • AIServiceTipsView.swift(AI 云服务提示窗)
  • AudioManager.swift(JLAudioToolbox 音频工具)
  • R.generated.swift(本地化资源定义,"AI info helper" 键)
  • 相关兄弟页面:表盘市场(Dial Market)、设备配对与鉴权、HTTP 客户端封装
Prev
登录注册与用户中心
Next
本地数据库与持久化