直接从 Monocle 访问 ChatGPT
arGPT for iOS:使用 iOS 设备进行 Monocle 的 AI 聊天
版权所有 2023 Brilliant Labs Ltd.
概述
iOS 版 arGPT是一款与您的Monocle配对的应用程序,使您能够在任何需要的地方访问 ChatGPT。只需点击说出问题即可看到答案出现在您的视野中。iOS 应用程序还可以充当 ChatGPT 的独立聊天界面,允许通过 iOS 键盘输入查询。
入门
入门很简单:
- 安装 iOS 应用程序。
- 获取 OpenAI API 密钥。从帐户管理页面获取新的 API 密钥非常简单,如下所示。如果您还没有这样做,您将需要注册一个 OpenAI 帐户并设置计费。为了让您安心,我们建议新用户设置非常低的使用限制(在“计费和使用限制”下)。例如,5 美元的软限制和 10 美元的硬限制对于临时用户来说已经足够了,并且在一个月内不太可能达到。
- 打开应用程序并启动 Monocle!
对于开发人员
我们鼓励开发人员将 arGPT 扩展到 iOS或将其用作自己的 Monocle 应用程序的模板项目。本节提供程序结构的简要概述。
关键 iOS 应用程序源文件
iOS 项目位于ios/arGPT/
. ios/arGPT/arGPT.xcodeproj
使用 Xcode打开。所有源文件和资产都位于ios/arGPT/arGPT/
. 开始的关键文件是:
ARGPTApp.swift
:arGPT 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 模式。然后进入该状态并监视串行特征以确认该状态已成功。确认后,应用程序会要求 Monocleprint(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 位采样的缺点是动态范围的损失和对背景噪声的敏感性增加。