直接从 Monocle 访问 ChatGPT

arGPT for iOS:使用 iOS 设备进行 Monocle 的 AI 聊天

版权所有 2023 Brilliant Labs Ltd.

概述

iOS 版 arGPT是一款与您的Monocle配对的应用程序,使您能够在任何需要的地方访问 ChatGPT。只需点击说出问题即可看到答案出现在您的视野中。iOS 应用程序还可以充当 ChatGPT 的独立聊天界面,允许通过 iOS 键盘输入查询。

iOS 截图

入门

入门很简单:

  • 安装 iOS 应用程序
  • 获取 OpenAI API 密钥从帐户管理页面获取新的 API 密钥非常简单,如下所示。如果您还没有这样做,您将需要注册一个 OpenAI 帐户并设置计费。为了让您安心,我们建议新用户设置非常低的使用限制(在“计费使用限制”下)。例如,5 美元的软限制和 10 美元的硬限制对于临时用户来说已经足够了,并且在一个月内不太可能达到。

OpenAI API 密钥

  • 打开应用程序并启动 Monocle!

对于开发人员

我们鼓励开发人员将 arGPT 扩展到 iOS或将其用作自己的 Monocle 应用程序的模板项目。本节提供程序结构的简要概述。

关键 iOS 应用程序源文件

iOS 项目位于ios/arGPT/. ios/arGPT/arGPT.xcodeproj使用 Xcode打开。所有源文件和资产都位于ios/arGPT/arGPT/. 开始的关键文件是:

  • ARGPTApp.swiftarGPT for iOS是一个 SwiftUI 应用程序,这是主模块。它定义了顶级 SwiftUI 视图,并实例化了一个非常重要的类对象Controller,该对象处理程序逻辑,包括与 Monocle 的通信。
  • Controller.swift:主程序控制器和应用程序的核心。执行以下操作:
    • 订阅pairedDeviceID设置:这决定了我们与哪个 Monocle 设备“配对”。不执行蓝牙绑定。相反,iOS 应用程序会存储每次连接到 Monocle 时使用的设备 ID。当此更改时,无论是在应用程序的 iOS 设置面板中还是在应用程序的设置屏幕中,Controller都会通知蓝牙管理器。如果设备 ID 已更改,蓝牙管理器将断开与当前设备的连接并尝试连接到新设备。
    • 订阅BluetoothManager对象上的蓝牙事件:
      • peripheralConnected:每当与 Monocle 设备建立连接时触发。这会启动一个状态机,将 Python 脚本上传到 Monocle 并处理 iOS 应用程序和 Monocle 之间的双向通信。
      • peripheralDisconnected:表示 Monocle 已断开连接。
      • serialDataReceived:已在串行 Tx 特性上接收到数据。Monocle 上的 MicroPython 将此用作其标准输出,iOS 应用程序对其进行监视,以确保 Monocle 在每一步中都处于预期状态。
      • dataReceived:根据数据 Tx 特性已接收到数据。这用于特定于应用程序的消息传递(来自 Monocle 脚本的命令)。
    • 接受来自 Monocle(作为语音数据)或应用程序聊天窗口(作为文本字符串)的查询,以传递到 ChatGPT。
    • 使用简单的状态机将所需的 Python 脚本传输到 Monocle。Monocle 首先被置于原始 REPL 模式。
    • 将用户查询发送到 ChatGPT,然后将结果转发到 iOS 聊天窗口和 Monocle。
  • Bluetooth/BluetoothManager.swift:蓝牙接口。使用Apple的CoreBluetooth框架连接到 Monocle 设备,通过串行和数据特性提供双向通信,并使用合并发布器转发所有事件。
  • OpenAI/ChatGPT.swift:向 ChatGPT 提交维护对话历史记录的请求。当超过历史记录限制时,历史记录将被自动清除。尝试执行后台 URL 请求,以便应用程序可以在屏幕关闭时运行。
  • OpenAI/Whisper.swift:将音频提交给 Whisper 进行转录。请注意,音频首先由 转换为 M4A 格式Controller
  • Chat/:该子目录包含所有与聊天相关的 SwiftUI 视图和模型对象。
  • Settings/:包含所有与设置相关的 SwiftUI 视图和模型对象。该类Settings为应用程序的设置提供了一个界面,允许更改 GPT 模型版本等。设置更改已发布。

Python脚本

在 Monocle 上运行的 Python 代码存储在ios/arGPT/arGPT/Script Assets/. 所有文件都上传到 Monocle,然后指示运行main.py与 iOS 应用程序的通信使用数据特性。

iOS/Monocle 通信流程

从 iOS 配套应用程序的角度来看,与 Monocle 的通信由一个简单的状态机驱动:

  • disconnected: 没事做。正在等待连接到 Monocle。
  • waitingForRawREPL:连接时,iOS 应用程序通过串行特性传输控制代码,将 Monocle 置于原始 REPL 模式。然后进入该状态并监视串行特征以确认该状态已成功。确认后,应用程序会要求 Monocle print(ARGPT_VERSION)如果ARGPT_VERSION已定义且与预期版本字符串匹配,则应用程序进入该running状态。否则,它会加载 Python 脚本并开始依次传输它们。
  • transmitingFiles:此状态监视串行特性,以确保在开始下一次传输之前最新的文件已被接受。一旦完成,running就进入状态。
  • running:应用程序正在运行并响应数据特征上的命令。

状态running是大部分工作发生的地方。Monocle 使用简单的协议与应用程序进行通信。onMonocleCommand所有命令均在in中处理Controller.swift尽管从技术上讲是有状态的,但该协议的设计目的是让 iOS 应用程序可以简单地对每个命令做出反应。每个命令由 4 个字符组成,后跟可选的命令特定数据:

  • ast::音频开始。Monocle 将发送新的音频流。应删除当前缓冲的音频。
  • dat:音频数据。音频数据按顺序发送,一次一个 MTU 大小的块,并存储在缓冲区中。
  • aen:音频结束。Monocle 已完成音频传输。iOS 应用程序现在可以将音频传输到 OpenAI 进行转录。转录完成后,结果将存储在映射中并分配一个唯一的转录 ID。ChatGPT 请求不会自动启动,因为不允许多个后台模式 URL 请求。相反,转录 ID 被发送回 Monocle(pin:命令,表示“ping”),然后 Monocle 会将其发送回(“pong”)以启动新的后台请求。
  • pon:转录请求乒乓球。Monocle 将转录 ID 发送回给我们,这完全是多余的,除非它应该在后台模式下第二次唤醒我们的应用程序,允许将新的 URL 请求发送到 OpenAI for GPT。完成后,将使用res:命令将响应消息发送到 Monocle,后者会显示结果。

Python 脚本版本控制

SHA-256 摘要是通过将 Python 脚本及其文件名连接在一起来计算的。然后,就在传输它们之前,版本字符串被插入到源代码中。因此,如果iOS 版 arGPT已在 Monocle 上运行,则该arGPTARGPT_VERSION已被定义并且可以根据 iOS 应用程序的 Python 脚本进行检查。

音频格式

从初始版本开始,8 位 8KHz 单声道音频从 Monocle 发送,以最大限度地减少传输时间。iOSAVAudioPCMBuffer本身并不支持这种格式,但转换为 16 位缓冲区很简单。

Whisper 期望 16 位 16KHz 音频。8 位采样的缺点是动态范围的损失和对背景噪声的敏感性增加。

GitHub

查看 Github