You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在aiogram中用OpenAI Whisper转录Telegram语音消息(无需存盘)

在aiogram中直接用OpenAI Whisper转录语音(无需保存到磁盘)

要实现不存磁盘直接转录,核心是让Whisper能正确识别内存中的音频字节流,同时处理好内存回收问题,具体方案如下:

关键原理

Whisper并非只能处理磁盘文件,它可以接受io.BytesIO对象,但需要给对象设置正确的文件名(带格式后缀),让模型能识别音频格式;另外要确保文件指针处于起始位置,否则模型会读取空内容。

实现步骤与代码示例

1. 安装依赖

pip install aiogram openai-whisper

2. 完整代码

import io
import whisper
from aiogram import Bot, Dispatcher, types
from aiogram.types import ContentType
from aiogram.utils import executor

# 替换为你的Bot Token
BOT_TOKEN = "YOUR_BOT_TOKEN"
bot = Bot(token=BOT_TOKEN)
dp = Dispatcher(bot)

# 加载Whisper模型,可根据需求选择base/small/medium等规格
model = whisper.load_model("base")

@dp.message_handler(content_types=ContentType.VOICE)
async def transcribe_voice(message: types.Message):
    # 获取语音文件的远程存储路径
    voice_file = await bot.get_file(message.voice.file_id)
    # 下载语音字节数据到内存
    voice_data = await bot.download_file(voice_file.file_path)
    
    # 将字节数据封装为带格式标识的BytesIO对象
    voice_io = io.BytesIO(voice_data.read())
    voice_io.name = "voice.ogg"  # aiogram默认语音格式为OGG
    voice_io.seek(0)  # 将文件指针移到起始位置,确保Whisper能读取完整内容
    
    # 执行语音转录
    result = model.transcribe(voice_io)
    await message.reply(f"转录结果:{result['text']}")

if __name__ == "__main__":
    executor.start_polling(dp, skip_updates=True)

核心细节说明

  • 设置文件名后缀:必须给BytesIO对象指定带格式的name(如voice.ogg),Whisper会通过后缀判断音频编码格式,否则无法正确解析内容。
  • 重置文件指针:调用read()后,BytesIO的指针会停在内容末尾,必须用seek(0)移回开头,否则Whisper读取不到有效数据。
  • 内存回收:BytesIO对象在函数执行完毕后,会因为失去引用被Python垃圾回收机制自动清理,不会长期驻留内存。若处理超大音频文件,可在转录完成后手动执行del voice_io, voice_data加速内存释放。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 22:57:13