首页博客 → 如何做一个把语音消息转成文字的 Telegram 机器人

如何做一个把语音消息转成文字的 Telegram 机器人

发布于 2026-08-20 · 6 分钟阅读

开会时、地铁上,或者纯粹懒得听的时候,语音消息都很碍事。一个收到语音就回文字的机器人能解决这个痛点,做出来只要一个晚上。下面是完整链路。

机器人做什么

逻辑就四步:

  1. 收到带语音消息的更新,取出文件标识。
  2. 按 Telegram 给的链接下载文件。
  3. 送去识别。
  4. 在同一条消息下回复文本。

一个顺手的细节:Telegram 的语音是 ogg/opus,这个格式可以直接收,无需转换。

处理函数

示例用的是 python-telegram-bot,换任何库逻辑都一样:

import io
from telegram import Update
from telegram.ext import Application, MessageHandler, filters, ContextTypes
from openai import OpenAI

client = OpenAI(base_url="https://voicesscribe.com/v1", api_key="your key")

async def on_voice(update: Update, ctx: ContextTypes.DEFAULT_TYPE):
    voice = update.message.voice or update.message.audio
    tg_file = await ctx.bot.get_file(voice.file_id)
    buf = io.BytesIO(await tg_file.download_as_bytearray())
    buf.name = "voice.ogg"

    text = client.audio.transcriptions.create(model="whisper-1", file=buf).text
    await update.message.reply_text(text or "没有识别到语音")

app = Application.builder().token("机器人令牌").build()
app.add_handler(MessageHandler(filters.VOICE | filters.AUDIO, on_voice))
app.run_polling()

关键的一行是给 buf.name 赋值。没有文件名,库就判断不出格式,请求会失败。

容易踩的地方

第一版之后加什么

第一版只回纯文本。接下来通常加三样:长消息的摘要、单用户配额(免得机器人变成全网免费服务)、以及转录留档方便检索历史。

用量按音频分钟数统计:计费就是这么算的,这个数字同时也告诉你每个用户的成本。

用你自己的录音试一试。 注册只需一分钟,免费额度足够判断识别质量。

免费获取 API 密钥

常见问题

Telegram 的语音需要转格式吗?

不需要。消息里就是 ogg/opus,直接收即可,只要上传时给个 .ogg 结尾的文件名。

很短的语音为什么会报错?

那通常是误触产生的零点几秒空录音。发送前先检查时长。

怎么统计谁用了多少?

按用户累加已处理消息的时长:计费按音频分钟走,这个指标就是你的成本。

圆形视频消息能识别吗?

可以,里面的音频照常识别,只是在接口里属于另一种消息类型。

相关阅读