考虑创建一个应用程序来处理 ChatGPT.它的任务将是通过Telegram ,接收语音信息,将其转换为文本,传输到ChatGPT ,并将回复发送至Telegram 。在创建过程中,你将需要经历以下步骤:

  1. Telegram ,创建一个机器人,并对其进行基本设置。
  2. 接收一个带有语音信息的文件 (Telegram 使用.oga 格式)。
  3. 将文件从oga 转换为mp3
  4. mp3 文件传输到 Whisper服务,以便转换为文本。
  5. 将收到的文本发送至ChatGPT
  6. ChatGPT 发送一个响应给Telegram 的用户。

为Telegram 创建一个机器人及其基本设置

这一切都始于注册一个机器人的事实。为此,Telegram 使用它自己的特殊机器人 -- BotFather.你需要写信给他,并通过简单的连续步骤。

Telegram BotFather

结果,你应该有一个指向你的机器人的链接和一个用于请求其API的令牌。

现在,你可以继续设置机器人在 AppMaster.最简单的方法是安装适当的模块。你只需要在模块列表中选择它并在设置中指定你的API令牌。

Telegram Module

必要的模型将在你的项目中自动创建,与Telegram ,以及基本的Telegram业务流程的块将出现。 Telegram: Echo.值得仔细考虑和理解的是工作原理。

Telegram Echo business process

在输入端,它接收来自TelegramMessage 模型)的消息。它包含发送消息的文本(text),以及chat 模型,你可以从中得到发件人的标识符(id)。最后一个块 Telegram: Send Message将收到的消息发回给发件人,但代表机器人。

你可以使用这个业务流程对机器人进行初步测试,并与它进行沟通。要做到这一点,你需要创建一个端点,它将接收信息并启动一个业务流程。

Telegram bot endpoint

在创建它时,重要的是要禁用 Middleware Token Auth.该端点必须是开放的,可以在没有授权的情况下使用。

Telegram 机器人的操作原理非常简单--所有将被发送到它的信息都会进入一个特殊的webhook,它可以自动进一步转移它们,并将它们发送到你选择的端点以采取进一步行动。

因此,最后一步仍然是激活机器人--你需要在Telegram 中注册这个端点,并表明这个机器人应该与之相关。这需要发送一个POST-request,其中包含完整的端点URL,并指出你的机器人令牌,而不是{Bot API Token} ,地址为

https://api.telegram.org/bot{Bot API Token}/setWebhook

如果你收到这样的响应信息,那么一切都做得很正确。

 {

    "ok": true,

    "result": true,

    "description": "Webhook was set"

}

Post Telegram Webhook

机器人已经准备好工作了,你可以给他发送消息并得到回复。

接收一个带有语音信息的文件

Telegram 模块主要是为处理文本信息而设计的。而我们的任务是获得一个带有语音信息的文件。使用AppMaster ,你可以轻松解决这个问题。首先,我们需要分析我们一般从Telegram 收到的内容,以解析信息的结构。该 Get Request Body块就是为此而设计的。它消除了提前指定请求结构的需要,并允许你接收整个请求,不管其内容如何。这个块以一组字节的形式返回查询结果,你可以使用 To String块将结果以人类可读的形式呈现出来,也可以将其保存在日志 (Write to Log块),以便进一步分析。

Telegram Request log

我们对整个请求中的两个参数感兴趣:

Sender ID- 在请求中指定为"id":300493858
File ID-"file_id":"AwACAgIAAxkBAAMzZBk6QRvO-OYWsWUC-Bu1UXDM2FwAAkktAAKTZclIWTSkfTTw8wYvBA"

你可以创建你自己的模型来匹配请求,并使用它来获得所需的字段。但是创建一个正则表达式(Regex)并使用它。要做到这一点,该 String Match Regex块将表达式本身作为输入,以及与给定表达式匹配的字符串将被检查。

在第一种情况下,该表达式是 "id":"\d+

结果,我们得到了字符串"id":300493858 ,我们需要用代码块将其中多余的 ("id":) ) 去掉,只留下标识符本身。 Replace String块,只留下标识符本身。

在第二种情况下,原理是完全一样的,但使用了一个稍微复杂的表达式: "file_id":"[^"]+

Regex to get request ID

现在我们有了发送者ID和文件ID,我们可以用它来获取文件本身。要做到这一点,你需要转向Telegram API 。这一点在之前注册机器人的端点时已经做过了。现在你需要做一个类似的请求来获取文件。请求URL中的{File ID} ,必须用收到的文件ID替换。

https://api.telegram.org/bot{Bot API Token}/setWebhook/getFile?file_id={File ID}

要发送一个请求并接收其结果,我们使用 HTTP Request块,指定URLMethod = GET作为它的参数。

Telegram File Request

从收到的响应中,你可以找出文件的相对路径,它被传递到"file_path"参数中。因此,使用下一个正则表达式("file_path":"[^"]+ ),你可以提取所需的值并与 "https://api.telegram.org/file/bot{Bot API Token}/"连接,以获得文件的完整链接。

将文件从OGA 转换为MP3

文件被收到了,但是障碍在于 Whisper服务不支持使用 OGA格式。你需要转换为适当的格式之一。

作为一个例子,我们使用了 Zamzar服务(其免费计划支持每月进行100次转换),并将其转换为MP3

你可以参考它的文档了解详情,或者使用其他类似的服务。我们将不详细分析使用它的工作,我们只考虑与实施AppMaster 直接有关的部分。

首先,请求将需要正确的认证数据。它们必须以如下格式提供 Basic Authentication格式提供。要做到这一点,你需要在请求中传递一个带有数值的头:

Key = 'Authorization'

Value = 'Basic '+ 用户ID和密码,用": "分开,格式为 base64格式

在注册服务时获得的API密钥是用户ID。你需要在其上添加":",并使用Base64 格式的编码。 To Base64块进行编码。其结果需要变成一个头(Make Key-Value (String)块)。

Zamzar Auth Header

下一步是在数据库设计器中为查询创建一个模型。该请求必须以 Multipart Form格式,因此有必要准备一个该请求形式的模型。在我们的例子中,该模型由三个类型的字段组成:String

  • source_file- 源文件的完整路径(在上一步中已经了解到)。
  • source_format- 源文件格式,在这个例子中,它是一个固定值 "ogg"。
  • target_format- 转换的目标格式。你可以选择任何由Whisper 支持的格式。让我们用 "mp3" 作为例子。

Zamzar Request Model

在业务流程编辑器中,你需要使用 Make块来填写模型数据,并使用POST 请求将其发送到 https://sandbox.zamzar.com/v1/jobs/HTTP Request块将其作为一个 请求发送到 (请确保指定 Serialize request body = Multipart Form).

Zamzar Conversion Request

应该注意的是,这个请求并不返回转换后的文件,而只是创建一个任务来转换它。你需要单独申请结果;为此,你需要创建任务的ID。这个ID必须从请求的响应体中获得,为此,应该使用正则表达式和提取id值来完成已经制定的过程。

转换的结果必须单独应用。这就需要再提出两个请求。第一个是找出结果是否已经准备好。第二个是拿起完成的文件。同时,我们不知道准备就绪的确切时间,所以我们可以组织一个循环,以一定的时间间隔(例如,每秒钟)发送重复的请求来检查准备就绪情况。

Zamzar Conversion Check Loop

必须使用GET 方法向URLhttps://sandbox.zamzar.com/v1/jobs/{id} 发送一个HTTP Request ,其中{id} 是在上一步获得的任务ID。这使用了与前一个请求相同的头信息。

从收到的响应中,你需要找出准备就绪的状态。如果转换已经完成,响应将包含 "status": "successful"而对我们来说,这是一个信号,表明我们可以完成循环并继续前进。

除了状态之外,响应还必须包含完成文件的ID ("target_files":[{"id":)。它必须被提取出来,以获得文件的最终链接,其形式为https://sandbox.zamzar.com/v1/files/{ID}/content

同时,接收文件只对授权用户开放,所以你需要使用与以前的请求相同的标头来执行HTTP Request

作为请求的结果,将获得文件的内容,必须给它起个名字,并保存起来以便进一步使用。

Zamzar save converted file

将一个MP3 文件发送到Whisper ,以便转换为文本

现在,一切都为下一步做好了准备--发送一个带有语音信息的文件进行识别。这将需要另一个请求,其格式为 Multipart Form格式的另一个请求。只是与前面的例子不同,这个请求需要传输文件本身,而不是文件的链接。

这样一个请求的模型可以在 External HTTP Request章节中创建。在这种情况下,你可以不完全创建一个请求,而只限于创建一个请求体模型。该模型本身由两个参数组成:

  1. File(Virtual Filetype) - 需要被识别的相同文件。
  2. model(类型 String)--在这里我们指定值 whisper-1.

Whisper request model

此外,对于请求来说,有必要获得一个密钥,以便与 OpenAIAPI并生成一个授权头的 Bearer Token类型。

Key = 'Authorization'

Value = 'Bearer '+ OpenAI API Key

接下来,你可以发送POST 请求本身,以识别语音信息到Whisper 服务的URL上https://api.openai.com/v1/audio/transcriptions

Whisper HTTP Request

作为成功识别文件的结果,将收到一个响应,其形式为{"text": "Hello world.”}

将收到的文本发送至ChatGPT

你可以继续使用 HTTP Request块来发送一个请求到 ChatGPT.来探索API文档,以及独立创建请求和响应的模型。但你也可以使用一个更简单的选项,即来自AppMaster 的现成模块,用于处理 OpenAI,它必须安装在模块部分。

OpenAI Module

在最小的足够版本中,你只需要指定 OAI ChatCompletionMessage模型的参数 (role = user,content = 要发送的信息),将其添加到数组中,并通过模块向ChatGPT 发送一个请求。 OpenAI: Create Chat Completion块(设置参数 model = gpt-4).

OpenAI Request

结果,我们从ChatGPT 得到一个响应。我们从 content的参数中读取。 OAI ChatCompletionChoice模型。

ChatGPT Response

从ChatGPT 发送一个响应给一个用户,在Telegram

最后一步只是重复之前已经做过的事情--向Telegram 。但如果我们一开始只是简单地将消息返回给发送者,现在这条消息已经启动了一系列不同的动作,其结果是作为一个响应从ChatGPT

Telegram send ChatGPT response

在开发这样一个机器人的过程中,值得考虑:

  1. Telegram 以这样的方式工作,即机器人发出的每个请求必须被成功处理。否则,他将尝试多次重复,这意味着在有任何问题的情况下,你将一次又一次地收到它。确保逻辑构建的方式是,请求不会导致错误,并能成功处理。
  2. 并非所有的请求在第一次尝试时都能按预期进行。你将需要搜索错误,为此要安排到 Write to Log块。它们既有助于检查每个块是否真正收到你计划传输的数据,也有助于分析块的结果和详细研究响应。
  3. 作为指南的一部分,我们假设所有的请求都是可预测的和成功的,并且这个过程是相当线性的。在实践中,有必要提供各种行动选项(例如,如果用户发送的是文字信息而不是语音信息,甚至是图片,该怎么做)和错误处理(检查HTTP请求的状态,考虑不同的响应选项)。
Was this article helpful?

AppMaster.io 101 速成班

10 模块
2 周数

不知道从哪里开始?通过我们的初学者速成课程,从A到Z探索AppMaster。

开始课程
Development it’s so easy with AppMaster!

需要更多帮助?

在我们专家的帮助下解决任何问题。节省时间并专注于构建您的应用程序。

headphones

联系支持

告诉我们您的问题,我们会为您找到解决方案。

message

社区聊天

在我们的聊天中与其他用户讨论问题。

加入社区