如何在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
相关产品推荐
相关产品推荐

