首页 → 博客 → 如何做一个把语音消息转成文字的 Telegram 机器人
如何做一个把语音消息转成文字的 Telegram 机器人
开会时、地铁上,或者纯粹懒得听的时候,语音消息都很碍事。一个收到语音就回文字的机器人能解决这个痛点,做出来只要一个晚上。下面是完整链路。
机器人做什么
逻辑就四步:
- 收到带语音消息的更新,取出文件标识。
- 按 Telegram 给的链接下载文件。
- 送去识别。
- 在同一条消息下回复文本。
一个顺手的细节: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 赋值。没有文件名,库就判断不出格式,请求会失败。
容易踩的地方
- 回复慢。识别期间发一个"正在输入"状态,否则看起来像卡死了。
- 文本过长。Telegram 会截断超过 4096 字符的消息,长文本要分段发。
- 圆形视频。视频消息是单独的 video_note 类型,音频同样能识别,但要显式处理这个类型。
- 群聊。机器人默认看不到别人的消息,隐私模式要去 BotFather 关掉。
第一版之后加什么
第一版只回纯文本。接下来通常加三样:长消息的摘要、单用户配额(免得机器人变成全网免费服务)、以及转录留档方便检索历史。
用量按音频分钟数统计:计费就是这么算的,这个数字同时也告诉你每个用户的成本。
用你自己的录音试一试。 注册只需一分钟,免费额度足够判断识别质量。
免费获取 API 密钥常见问题
Telegram 的语音需要转格式吗?
不需要。消息里就是 ogg/opus,直接收即可,只要上传时给个 .ogg 结尾的文件名。
很短的语音为什么会报错?
那通常是误触产生的零点几秒空录音。发送前先检查时长。
怎么统计谁用了多少?
按用户累加已处理消息的时长:计费按音频分钟走,这个指标就是你的成本。
圆形视频消息能识别吗?
可以,里面的音频照常识别,只是在接口里属于另一种消息类型。
相关阅读
- 语音消息转文字:Telegram、WhatsApp 及其他即时通讯工具 — 如何自动把语音消息转成文字:处理 ogg/opus 格式、提升短录音准确率、应对静音,以及可直接使用的聊天机器人代码。
- 如何让语音备忘自动变成文字笔记 — 把手机和录音笔里的语音备忘变成可搜索的笔记:同步文件夹、监视脚本、笔记模板,以及户外录音的准确率技巧。
- Python 语音转文字:从一个文件到可用脚本 — 十分钟搭好 Python 语音转文字:安装、第一个请求、响应格式怎么选、错误处理与并发加速,以及最浪费时间的几个坑。