返回博客

我如何将 Telegram 机器人连接到我的后端以进行实时韵律分析

2026-02-225 min read

我一直在构建 Acento,一个分析你说英语方式的发音辅导工具。它最初是一个 Web 应用,但练习口语最自然的方式就是直接发送语音消息。所以我将后端连接到了一个 Telegram 机器人。你录音,它分析,你得到反馈。无需安装应用,无需浏览用户界面。

以下是各个组件如何协同工作的方式,从 webhook 和 API 到音频管道和将 Telegram 用户与真实账户关联起来的授权层。

API,Cloud Run 上的 FastAPI

后端是一个部署在 Google Cloud Run 上的 FastAPI 应用。它暴露了几个关键的端点,但其中两个最重要。

  • POST /api/analyze,Web 应用使用的主要分析端点
  • POST /api/telegram/webhook,Telegram 将机器人收到的每条消息发送到此端点

Cloud Run 自动处理扩展。当凌晨 3 点没有人发送语音消息时,它会缩减到零。当午休时间有十几个人在练习时,它会启动更多实例。后端是无状态的,所以这很有效。

Telegram 机器人本身是通过 BotFather 注册的,我将 webhook URL 设置为指向我的 Cloud Run 服务。从那时起,机器人的聊天中发生的每条消息、语音或按钮点击都会作为 JSON 有效载荷转发到我的端点。

接收和路由 Telegram 更新

当 Telegram 命中 webhook 端点时,后端首先要做的是验证请求。Telegram 在 X-Telegram-Bot-Api-Secret-Token 标头中发送一个密钥令牌,我使用恒定时间检查来比较它,以防止时序攻击。如果密钥不匹配,请求会立即被拒绝。

验证后,处理程序会检查它是哪种类型的更新。

  • 文本命令,如 /start/help/practice/setkey,会被路由到各自的处理程序
  • 语音消息会触发完整的分析管道
  • 回调查询处理内联按钮点击,例如当用户点击“详情”以展开其结果时

Webhook 总是会快速返回 200 OK。实际处理在后台进行,这样 Telegram 不会因为等待响应而超时。

从语音消息到韵律得分

当用户发送语音消息时,后端会经过几个步骤。

  1. 使用 webhook 有效载荷中的文件 ID 从 Telegram 服务器下载音频
  2. 使用 pydub 和 ffmpeg 将其从 OGG/Opus(Telegram 的默认格式)转换为 16kHz 单声道的 WAV 格式
  3. 使用 Parselmouth(Praat 的 Python 包装器)对五个维度进行韵律分析,包括半音调的音高范围、音量动态、语速、节奏模式 (nPVI) 和停顿分布
  4. 通过将音频发送到 Google Gemini 来生成 AI 辅导,以获取转录和发音技巧
  5. 格式化并通过 Telegram Bot API 发送紧凑的响应

每个维度都会获得 1 到 10 的分数,并将它们组合成一个加权总分,其中音高占 25%,音量和语速各占 20%,节奏占 20%,停顿占 15%。用户会收到一个快速摘要,其中包含他们最主要的问题和一个可操作的提示,以及一个可以点击查看完整细分的“详情”按钮。

两条路径,一个授权系统

后端支持两种授权方法。

Firebase ID 令牌是 Web 应用使用的。前端在 Authorization 标头中发送一个 Bearer 令牌,后端使用 Firebase Admin SDK 验证它,用户即可完全访问其历史记录、进度和 AI 辅导。

API 密钥是 Telegram 机器人使用的。当用户通过 Web 应用创建 API 密钥时,后端会生成一个随机密钥,仅显示一次,并将该密钥的 SHA-256 哈希值存储在 Firestore 中。该密钥通过 X-Acento-Key 标头发送。每个密钥都有一个可配置的每日限制,以防止滥用。

但是 Telegram 用户不发送 HTTP 标头。他们只是发送语音消息。因此,我需要一种方法将 Telegram 聊天与 Acento 账户关联起来。

将 Telegram 与您的账户关联

/setkey 命令弥合了差距。用户在机器人聊天中输入 /setkey acento_xxxxx。后端会立即删除该消息(这样密钥就不会留在聊天记录中),对密钥进行哈希处理,在 api_keys 集合中查找它,如果匹配,则创建一个 telegram_links 文档,将他们的 Telegram 聊天 ID 映射到他们的 Acento 用户 ID 和 API 密钥。

从那时起,来自该聊天的每条语音消息都会自动与他们的账户相关联。后端会检查他们的 API 密钥配额,将分析会话保存到 Firestore,并跟踪他们的练习连胜。

尚未关联账户的用户仍然可以使用该机器人。他们可以获得韵律分析(没有 AI 辅导),每天最多 10 次分析,使用单独的 telegram_anon_usage 集合按聊天 ID 跟踪。

每日提醒和连胜

一旦用户关联成功,他们可以选择接收每日练习提醒。一个 Cloud Scheduler 作业每小时向 POST /api/telegram/send-reminders 发送一个带有密钥标头的请求。后端会检查哪些用户在该小时启用了提醒,并向他们发送包含练习句子的消息。

提醒消息会根据上下文进行调整。如果你有一个活跃的连胜记录但错过了昨天,你会收到一个“不要打破你的连胜”的提醒。如果你已经有三天或更长时间没有活动,则会收到一个更温和的重新参与提示。如果你连续几天练习,连胜记录就会增加;如果你跳过一天,连胜记录就会重置。

整合

完整的流程如下所示。

Telegram Bot Backend Architecture Flow

没有应用商店,没有注册表单,没有加载屏幕。只需打开 Telegram,录制你的声音,几秒钟内就能得到反馈。架构保持简单。一个 webhook 端点,一个分析管道,以及一个轻量级的关联机制,它将 Telegram 的世界与系统的其余部分连接起来。

如果你想亲自尝试一下,请访问 accent.learnenglishsounds.com 并录制一些内容。或者直接在 Telegram 上打开 机器人并发送一条语音消息。入门是免费的,无需注册账户。

保持更新

将最新文章和见解发送到您的收件箱。

Unsubscribe anytime. No spam, ever.