Photon AI Translator 和做产品的一些思考
近 4 个月内我一直在做 Apple 平台的产品,虽然从使用量来说「简体中文」用户是占多数,但我一直有做多语言的支持:英语、简体中文和繁体中文。习惯上 Google 翻译的我,基本上在使用 Xcode 过程中也会一直在浏览器开着 Google Translate 的网页,为的是能 ”随时“ 地去把简体中文翻译成繁体中文——当然这个 ”随时“ 可真不是随时,毕竟从 Xcode 切换到 Chrome 再到对应的 Tab 还是需要点功夫。
是的,我知道浏览器划词翻译已经有众多的插件来支持——但是我日常开发工作的主战场,并不是在浏览器。作为使用 MacBook Pro 单屏幕开发的人来说,切换一个窗口都是麻烦的事情。
有没有能帮我加速这个工作流的工具呢?
如果没有,或者找不好,那就很简单:自己做一个。
以上只是需求背景,契机是:Open AI 开放 API 了,我们可以使用同样驱动 ChatGPT 的 GPT-3.5 模型,来接入 AI 到我们自己的工作流了。在社交网络到处充斥着关于 ChatGPT 的消息的时候,你很难不去对它的作用产生思考:
- 利用 OpenAI API 能实现什么产品?解决什么痛点?
- 如何在现有产品上接入 OpenAI API,产生更高的价值?
第二点我在开始做一些尝试,但关于第一点,我用它来解决上述背景的需求:我做了一个 Mac 上的 Menu Bar 的翻译 app,并已经在 App Store 上线了。
Photon AI Translator

App Store 上的 Photon AI Translator
虽然也是「众多翻译 app」之中的一员,但它依然有自己的一些特色:
- 纯 Menu Bar 的 Mac app,在你点击 Menu Bar 上的图标之前,它是不会有窗口的,也不会占用你的 Dock 栏的位置。Menu Bar 在 macOS 里始终位于顶部,抛开因为挖孔导致的 Overflow 问题没有被解决外,它是你能随手可达的地方——当然,Overflow 问题,我个人推荐使用 Bartender 4 进行隐藏和整理。
- 支持翻译、词典、语法检查和提炼信息四种模式,你可以通过 ⌘ + 1-4 来快速切换到对应的模式
- 翻译模式为直接翻译模式,你可以选择对应的目标语言进行翻译。翻译模式特别新增「App 多语言」模式,对于 Apple 平台或者 Android 开发者来说,你可以复制粘贴你的 localization.strings 或者 strings.xml 内容,会以字典的模式进行翻译——也就是,你不用担心你的 key 会被翻译成对应的语言。
- 词典目前在英文语境下使用最佳,能给出一个单词的具体词典定义,如果它能用作名词、副词等,都会一并给出。
- 语法检查仅支持英文,用于检查并返回修复的语法。
- 提炼信息可以帮助你从一段文本里提炼总结,并以特定的目标语言输出。

当然,这一切都是 OpenAI 驱动,只不过 Prompts 是我自己调的。因此你需要一个自己的 API Key 才能访问——相信我,即便你不用此 app,学会使用 ChatGPT 以及注册好 OpenAI Platform,都会对你今后的工作效率有帮助。
目前仅支持 macOS 13 Ventura,你可以在 App Store 搜索并免费下载使用。
PhotonOpenAIKit 帮你的 app 快速接入 OpenAI
虽然 OpenAI 平台的 API 本身就可以直接通过 HTTP 请求来使用,但官方还是封装了 Python 的库以及一些提供了一些第三方库的 GitHub 参考。但可惜的是 Swift 版本的库目前还不支持 SSE 模式——你看官方 ChatGPT 的字是逐字出来的,是依靠这个模式来实现的:于是乎我又造了一个轮子,叫 PhotonOpenAIKit,来帮助你快速接入 OpenAI。
https://github.com/JuniperPhoton/PhotonOpenAIKit
此库目前仅支持 ChatCompletion,但配合上 GPT-3.5 模型,能满足很大部分的需求了。
更多详情和使用方式,请参考以上 GitHub 库的链接和 README。
做产品背后的一些思考
尽管这看起来像是一个关于 AI 和 ChatGPT 的「跟风」行为——坦白说确实有一方面的考虑在里面,如果现在你不接触多点这块的知识和消息,那么跟真正的互联网可能会慢慢产生信息差,这是从业人员害怕的一个事情。
但对于做的此 app 以及之前做的效率类 app MyerList 和 MyerTidy,我更多考虑的是:
用自己的技术和设计能力,做出最符合自己需求以及审美的工具。如果这同时也能解决潜在的一部分用户需求,那么就太好了,做多点用户体验上的包装以及优化,也希望他们用得舒服。
ChatGPT 以及 LLM 大型语言模型很厉害,它不是一蹴而就的产品,底层技术不是我们一般人或者开发者能学习得来。或许「调 API」是一个看上去没什么技术含量的工作,但「调 API 并用户(我们)带来实际的效率的提升」,也可能正是 OpenAI 平台开放 API 的一个初衷——但更何况,调 API 这事情本身也不是没有技术含量的工作,这里面太多细节和环节,都要做好,还是很花功夫的。
后记
在离职半年多后,我现在很难定义我是不是一个「独立开发者」——因为做的产品,并没有给我带来多少能让我生存的收入,更多的还是在用上班的钱,来体验不一样的「工作」。
之前在 Netflix 看到一部纪录片 Street Food: Asia,里面介绍了很多上了年纪还在做街边小吃的人,对他们来说——他们喜欢这个「工作」,这是一件能做到老的事情。在很多场合下,提起「上班」很多人都会头疼,但我从中感受到,上班跟工作不是一个事情的,根据使用 Photon AI Translator 词典功能,Work 的定义是:
Work (noun): activity involving mental or physical effort done in order to achieve a purpose or result.
只要你为自己的工作设定一个目标,只要完成了就应该是一件值得你高兴的事情,哪怕这个目标并不是通俗意义上的「挣钱」(虽然这是大多数人需要工作的目标)。
相关文章:
Photon AI Translator 和做产品的一些思考
近 4 个月内我一直在做 Apple 平台的产品,虽然从使用量来说「简体中文」用户是占多数,但我一直有做多语言的支持:英语、简体中文和繁体中文。习惯上 Google 翻译的我,基本上在使用 Xcode 过程中也会一直在浏览器开着 Google Trans…...
IPTV系统架构的分析与研究
1 引言 IPTV业务是伴随着宽带互联网的飞速发展而兴起的一项新兴的互联网增值业务,它利用宽带互联网的基础设施,以家用电视机和电脑作为主要终端 ,利用网络机顶盒(STB,Set -TopBox) ,通过互联网协议来传送电视信号.提供包括 电视节 目在 内…...
workerman开发者必须知道的几个问题
1、windows环境限制 windows系统下workerman单个进程仅支持200个连接。 windows系统下无法使用count参数设置多进程。 windows系统下无法使用status、stop、reload、restart等命令。 windows系统下无法守护进程,cmd窗口关掉后服务即停止。 windows系统下无法在一个…...
golang Gin实现websocket
golang使用 Gin实现 websocket,这里笔者重新搭建一个项目 1、创建项目安装依赖 项目名为 go-gin-websocket 在指定文件夹下,新建项目文件夹 go-gin-websocket 进入项目文件夹,打开cmd窗口,在项目(go-gin-websocket&a…...
冯·诺依曼体系结构与初始操作系统
目录 冯诺依曼体系结构 冯诺依曼体系结构图 内存 外存 网卡和磁盘 结构之间运算速度的差异 缓冲区 初始操作系统 概念 操作系统上边与下边分别有什么 从上到下依次顺序解析 用户 用户操作接口 系统调用接口 操作系统四项管理 驱动 硬件 冯诺依曼体系结构 冯诺…...
软件测试之黑盒测试的具体方法详解
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一.基于需求的设计方法二.等价类三.边界值四.判定表4.1 **关系**4.2 如何设计测试用例4.3 实际案例第一步第二步第三步第四步 五.正交排列5.1 什么是正交表5.2 …...
图形编辑器:历史记录设计
大家好,我是前端西瓜哥。今天讲一下图形编辑器如何实现历史记录,做到撤销重做。 其实就是版本号的更替。每个版本保存一个状态。 数据结构 要记录图形编辑器的历史记录,支持撤销重做功能,需要两个栈:撤销࿰…...
ubuntu22.04下挂载第二块硬盘
文章目录 一、查看硬盘情况二、找到nvme1n1三、挂载四、修改分区文件 一、查看硬盘情况 首先要查看一下系统识别出来的设备。也就是说,我希望知道,ubuntu到底发现了几块硬盘。用命令:lsblk 显示结果如下: 有两块硬盘:…...
举例说明.net中in与out的作用与区别
-----作用 在 .NET 中,in 和 out 是用于泛型类型参数的修饰符,它们用于指定参数类型的协变性和逆变性。 - in 修饰符:表示这个泛型类型参数是协变的。也就是说,in 类型参数可以从较特殊的类型隐式转换为较通用的类型。例如&…...
Java常见的100道面试题(内附答案及代码示例)持续更新
什么是Java程序? Java程序是一组可执行的代码,由Java编译器编译生成,可以在Java虚拟机(JVM)上运行。 public class HelloWorld {public static void main(String[] args) {System.out.println("Hello, World!&qu…...
策略设计模式知多少
目录 目标 概述 实现 目标 熟悉策略设计模式,了解策略设计模式的使用场景、具体实现。 概述 一、行为设计模式 行为设计模式是设计模式的一种类型。该类型的设计模式关注的重点在于对象的行为(通信和交互),而非对象的创建方…...
第三十九章 配置镜像 - 配置 ISCAgent - 在 UNIX Linux 和 macOS 系统上为非根实例启动 ISCAgent
文章目录 第三十九章 配置镜像 - 配置 ISCAgent - 在 UNIX Linux 和 macOS 系统上为非根实例启动 ISCAgent在 UNIX/Linux 和 macOS 系统上为非根实例启动 ISCAgent在 Microsoft Windows 系统上启动 ISCAgent 自定义 ISCAgent 第三十九章 配置镜像 - 配置 ISCAgent - 在 UNIX Li…...
嵌入式安卓开发:使用Camera2获取相机
文章目录 Camera2介绍Camera2的主要API类介绍CameraManager通过CameraManage获取Cameracharacteristics通过CameraManage获取CameraDevice从CameraDevice获取CameraCaptureSession预览效果 参考 Camera2介绍 从Android 5.0开始,Google 引入了一套全新的相机框架 Ca…...
阿里云g8i服务器Intel Xeon(Sapphire Rapids) Platinum 8475B
阿里云服务器ECS通用型实例规格族g8i采用2.7 GHz主频的Intel Xeon(Sapphire Rapids) Platinum 8475B处理器,3.2 GHz睿频,g8i实例采用阿里云全新CIPU架构,可提供稳定的算力输出、更强劲的I/O引擎以及芯片级的安全加固。阿里云百科分享阿里云服…...
设计模式——组件协作模式之观察者模式
文章目录 前言一、“组件协作” 模式二、Observer 观察者模式1、动机2、模式定义3、伪代码示例①、第一种方案,最朴素的方式②、第二种方案,重构使得遵循DIP原则:③、进一步的小优化:④、修改使得支持多个观察者: 4、结…...
观察者设计模式知多少
目录 目标 概述 实现 推设计模式 拉设计模式 被动观察者设计模式 目标 熟悉观察者设计模式,了解观察者设计模式的使用场景、具体实现(包括:推设计模式、拉设计模式、被动观察者设计模式)。 概述 一、行为设计模式 行为设…...
Flink之TaskManager内存解析
一、CK失败 Flink任务的checkpoint操作失败大致分为两种情况,ck decline和ck expire: (1)ck decline 发生ck decline情况时,我们可以通过查看JobManager.log或TaskManager.log查明具体原因。其中有一种特殊情况为ck cancel&…...
为何越来越多人不喜欢“试用期六个月”的公司?网友:感觉不靠谱
众所周知,任何一份工作都有试用期,一般是三月左右。但如果你遇到试用期达到半年的公司,你会不会进入? 近日,就有人遇到了此类公司,并对是否要进入该公司犹豫不决。他在论坛上发帖求助:大家是怎…...
单例模式的四种创建方式
前言 单例模式是日常开发中最常见的一种设计模式,常用来做为池对象,或者计数器之类的需要保证全局唯一的场景。 单例模式的目的是保证在整个程序中只存在一个对象实例,使用单例一个前提条件就是构造器私有化,不允许通过new 对象…...
Nginx+Keepalived 中的脑裂现象
如何解决和预防 NginxKeepalived 中会出现的脑裂现象? Nginx是一种高性能的Web服务器和反向代理服务器,可以处理大量并发请求。Keepalived是一种开源软件,用于实现IP负载均衡和故障转移。在Nginx和Keepalived结合使用时,可以通过将多个Ngin…...
从ARM Cortex-M到FPGA:手把手教你用AXI4-Lite搭建自定义外设(以Zynq-7000为例)
从ARM Cortex-M到FPGA:用AXI4-Lite实现自定义外设的工程实践 在嵌入式系统开发中,处理器与可编程逻辑的高效协同一直是提升性能的关键路径。当标准外设无法满足特定需求时,工程师往往需要在FPGA中设计定制硬件模块,并通过标准化总…...
别再傻傻等下载了!QMT历史数据获取的3个高效技巧(含xtquant代码示例)
QMT历史数据获取效率优化实战:3个让回测提速200%的高级技巧 每次打开QMT准备回测策略时,最让人抓狂的莫过于漫长的历史数据等待时间。作为一名量化研究员,我曾在数据准备环节浪费了无数个下午——直到发现这几个能彻底改变工作流的技巧。本文…...
告别通用OCR:如何用PaddleOCR针对银行卡场景做定制化检测模型优化?
告别通用OCR:如何用PaddleOCR针对银行卡场景做定制化检测模型优化? 银行卡识别一直是金融科技领域的高频需求,但通用OCR模型在应对银行卡这类特殊场景时往往力不从心。我曾参与过多个银行的移动端项目,亲眼见证过通用模型在识别卡…...
RK3588核心板硬件设计与系统开发全攻略:从接口解析到AI部署
1. 项目概述:为什么是PET_RK3588_CORE?在嵌入式开发和边缘计算领域,选对核心板,项目就成功了一半。今天要聊的这块PET_RK3588_CORE,是我最近深度折腾的一块板子,它基于瑞芯微的RK3588这颗“明星”SoC。如果…...
Zotero老用户必看!文献管理后的阅读断层,Scholaread如何让你的千篇文献库“活“起来?
你用Zotero管理了上千篇文献,却在阅读时不得不打开知云、翻译狗,笔记分散在多个软件,标注无法同步。这种"管理在Zotero,阅读在别处"的割裂体验,正在吞噬你的科研效率。本文将展示Scholaread如何通过一键导入…...
【2026】知云文献翻译安装使用指南:学术PDF划选即译,研究生必备工具
读英文文献最烦的不是词汇,是格式。复制到翻译软件,格式全乱、公式变问号、图注和正文混在一起。知云文献翻译的解法是直接在PDF里划选翻译,格式不动,原文译文左右对照,不用来回切换窗口。 这篇从安装到核心功能配置一…...
IDEA里Git冲突别慌!手把手教你用Rebase和Merge搞定,附代码消失急救指南
IDEA中Git冲突与代码消失的终极解决方案:Rebase与Merge实战指南 在团队协作开发中,Git冲突如同程序员日常的"必修课",而IDEA作为Java开发者最信赖的IDE,其内置的Git工具链却常被低估。当你在深夜赶进度时突然遭遇冲突警…...
从社交网络到疾病传播:ER随机图模型在实际场景中的仿真应用指南
从社交网络到疾病传播:ER随机图模型在实际场景中的仿真应用指南 在流行病学研究中,一个关键问题是如何预测疾病在人群中的传播速度和范围。想象一下,你是一名公共卫生官员,需要评估某种新型流感在小镇上的潜在传播风险。传统方法可…...
不止是怀旧:用Docker部署超级马里奥,聊聊容器化对经典软件保存的意义
容器化时光机:用Docker守护数字文化遗产的技术实践 在数字时代洪流中,经典软件如同沙漏中的细沙,正以惊人的速度从我们的指尖流逝。那些曾经定义了一个时代的程序、游戏和工具,正面临着"数字消亡"的威胁——操作系统迭代…...
SAP PP实战指南:从零到一掌握BOM创建、群组BOM配置与CS01核心操作
1. BOM基础概念与核心价值 物料清单(Bill of Materials,简称BOM)是制造业的DNA图谱,它用结构化数据描述产品从原材料到成品的完整演化路径。我第一次接触SAP PP模块时,项目经理指着屏幕上的BOM结构说:"…...
