讲师中心 微信公众号

工具推荐

视频效率加速
updream

一键生成高质量推广成片

剧云
剧云

中文短剧剧本制作平台

Laper
Laper

剧本策划到成片协作

立刻MV
立刻MV

低成本歌曲 MV、视频生成

在Aiogram中实现Telegram语音消息的实时Whisper转录

阿敏同学_3549

阿敏同学_3549

发布时间:2025-12-02 11:33:25

|

1008人浏览过

|

来源于php中文网

原创

在Aiogram中实现Telegram语音消息的实时Whisper转录

本文详细介绍了如何在aiogram框架下,不将telegram语音消息保存到磁盘,而是利用`io.bytesio`对象在内存中进行处理,并结合`faster-whisper`库实现高效的语音转录。通过这种方法,开发者可以构建响应迅速、资源友好的telegram机器人,直接将用户发送的语音消息实时转换为文本,有效避免了文件i/o操作带来的延迟和存储开销。

在Aiogram中实时转录Telegram语音消息

在构建Telegram机器人时,处理用户发送的语音消息并将其转录为文本是一项常见需求。传统方法可能涉及将语音文件下载到本地磁盘,然后再进行处理,但这会引入额外的磁盘I/O开销和文件管理复杂性。为了提高效率并减少资源消耗,一种更优的方案是利用内存中的io.BytesIO对象来存储语音数据,并直接将其传递给语音转录模型。

本教程将详细介绍如何在Aiogram框架下,结合faster-whisper库实现这一功能,从而无需将语音消息保存到磁盘即可完成转录。

核心原理

实现无盘转录的关键在于以下两点:

  1. io.BytesIO对象: 这是一个在内存中操作二进制数据的流,其行为类似于文件,但数据存储在RAM中。Aiogram可以将下载的文件内容直接写入这个内存流。
  2. faster-whisper库: 这是一个基于CTranslate2的OpenAI Whisper模型的重实现,它提供了比原始Whisper模型更快的推理速度和更低的内存消耗,并且能够直接接受文件路径或文件类对象(如io.BytesIO)作为输入。

准备工作

在开始之前,请确保你的环境中安装了必要的库:

pip install aiogram faster-whisper

faster-whisper在首次使用时会自动下载Whisper模型。你可以根据需求选择不同的模型大小(如tiny, base, small, medium, large)。

ImageMagick 批处理处理器
ImageMagick 批处理处理器

使用 ImageMagick 的 convert 和 mogrify 命令进行批量图像处理,支持调整大小、裁剪、水印和格式转换。与 libvips 集成以实现高性能缩略图生成。

下载

实现步骤

以下是在Aiogram中处理语音消息并进行转录的详细步骤:

  1. 导入所需库: 首先,我们需要导入aiogram的Message类型、faster_whisper库以及Python内置的io模块。

    from aiogram.types import Message
    from faster_whisper import WhisperModel
    import io
  2. 创建异步消息处理器: 定义一个异步函数来处理接收到的语音消息。这个函数将作为Aiogram的处理器注册。

    async def transcribe_voice_message(message: Message):
        # 确保消息包含语音
        if not message.voice:
            await message.reply("请发送语音消息。")
            return
    
        # 获取语音消息的文件ID
        file_id = message.voice.file_id
        bot = message.bot # 获取机器人实例
  3. 将语音文件下载到内存: 这是核心步骤。我们首先获取文件对象,然后创建一个io.BytesIO实例,并将语音文件的内容下载到这个内存流中。

        # 获取文件对象信息
        file = await bot.get_file(file_id)
        file_path = file.file_path
    
        # 创建一个BytesIO对象用于内存存储
        file_obj = io.BytesIO()
        # 将文件内容下载到BytesIO对象中
        await bot.download_file(file_path, destination=file_obj)
    
        # 重置缓冲区位置到开头,以便Whisper模型可以从头开始读取
        file_obj.seek(0)

    注意: file_obj.seek(0)这一步至关重要。download_file操作会将文件指针移动到流的末尾,如果不重置,WhisperModel将无法读取任何数据。

  4. 初始化Whisper模型并进行转录: 实例化WhisperModel,并将其audio参数直接设置为我们内存中的file_obj。

        # 初始化Whisper模型
        # "tiny" 是一个较小的模型,适合快速演示和资源有限的场景
        # 你可以根据需求选择 "base", "small", "medium", "large"
        # 首次运行时会自动下载模型
        model = WhisperModel("tiny", device="cpu", compute_type="int8") # 可以在GPU上运行 device="cuda"
    
        # 从BytesIO对象转录音频
        # language='en' 指定源语言,可以提高转录准确性,或设置为None进行自动检测
        segments, info = model.transcribe(
            audio=file_obj,
            language='en', # 假设语音是英文,如果未知可设置为None
            beam_size=5
        )
    
        # 组合转录片段成一个完整的字符串
        transcription = " ".join(segment.text for segment in segments)
        print(f'转录结果: {transcription}')
    
        # 将转录结果发送给用户
        await message.reply(f"语音转录结果:\n`{transcription}`")

完整示例代码

将以上步骤整合到一个完整的Aiogram机器人示例中:

from aiogram import Bot, Dispatcher, types
from aiogram.filters import CommandStart
from aiogram.types import Message
from faster_whisper import WhisperModel
import io
import asyncio
import logging

# 配置日志
logging.basicConfig(level=logging.INFO)

# 替换为你的Bot Token
API_TOKEN = 'YOUR_BOT_TOKEN' 

# 初始化Bot和Dispatcher
bot = Bot(token=API_TOKEN)
dp = Dispatcher()

# 初始化Whisper模型(可以全局初始化以避免重复加载)
# 选择合适的模型大小和计算类型
# "tiny" 模型较小,适合快速测试
# device="cpu" 或 device="cuda" (如果可用GPU)
# compute_type="int8" 通常在CPU上提供不错的性能
whisper_model = WhisperModel("tiny", device="cpu", compute_type="int8")

@dp.message(CommandStart())
async def send_welcome(message: types.Message):
    """
    处理 /start 命令
    """
    await message.reply("你好!请发送语音消息,我将尝试将其转录为文本。")

@dp.message(types.ContentType.VOICE)
async def transcribe_voice_message(message: Message):
    """
    处理用户发送的语音消息并进行转录
    """
    await message.reply("正在处理您的语音消息,请稍候...")

    try:
        file_id = message.voice.file_id

        # 获取文件对象信息
        file = await bot.get_file(file_id)
        file_path = file.file_path

        # 创建一个BytesIO对象用于内存存储
        file_obj = io.BytesIO()
        # 将文件内容下载到BytesIO对象中
        await bot.download_file(file_path, destination=file_obj)

        # 重置缓冲区位置到开头,以便Whisper模型可以从头开始读取
        file_obj.seek(0)

        # 从BytesIO对象转录音频
        # language='en' 指定源语言,可以提高转录准确性,或设置为None进行自动检测
        segments, info = whisper_model.transcribe(
            audio=file_obj,
            language='en', # 假设语音是英文,如果未知可设置为None
            beam_size=5
        )

        # 组合转录片段成一个完整的字符串
        transcription = " ".join(segment.text for segment in segments)

        if transcription:
            await message.reply(f"语音转录结果:\n`{transcription}`")
        else:
            await message.reply("未能识别语音内容,请重试。")

    except Exception as e:
        logging.error(f"语音转录失败: {e}")
        await message.reply(f"处理语音消息时发生错误:{e}")

async def main():
    await dp.start_polling(bot)

if __name__ == "__main__":
    asyncio.run(main())

注意事项与最佳实践

  1. io.BytesIO的生命周期: io.BytesIO对象及其包含的数据会一直存在于内存中,直到不再有对它的引用,然后由Python的垃圾回收机制回收。在上述示例中,file_obj在transcribe_voice_message函数执行完毕后,如果没有其他引用,就会被回收,因此无需担心内存泄漏或数据永久驻留。
  2. 模型选择: faster-whisper支持多种大小的Whisper模型。tiny模型速度最快但准确性最低,large-v2或large-v3模型最准确但速度最慢且内存占用最大。根据你的应用场景和硬件资源选择合适的模型。
  3. 计算设备与类型: WhisperModel初始化时可以通过device参数指定运行设备(cpu或cuda),通过compute_type参数指定计算精度(int8, int8_float16, float16, float32)。在有GPU的情况下使用cuda和float16通常能获得最佳性能。
  4. 错误处理: 在实际应用中,应增加更健壮的错误处理机制,例如处理网络中断、文件下载失败、转录模型加载失败或转录结果为空等情况。
  5. 并发性与资源: 如果机器人需要处理大量并发语音消息,需要考虑服务器的CPU/GPU和内存资源。faster-whisper在处理大型模型时可能会消耗较多资源。
  6. 语言检测: 如果语音消息的语言不确定,可以将language参数设置为None,让Whisper模型自动检测语言。但明确指定语言通常会提高转录准确性。

总结

通过利用io.BytesIO对象将Telegram语音消息直接下载到内存,并结合faster-whisper库进行高效转录,我们成功地构建了一个无需磁盘I/O的实时语音转文本机器人。这种方法不仅提高了处理速度,减少了系统资源占用,还简化了文件管理流程,为构建高性能的Aiogram应用提供了可靠的解决方案。开发者可以根据具体需求,进一步优化模型选择和错误处理,以满足生产环境的要求。

热门AI工具

更多
墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

399

2026.04.23

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

80

2026.11.06

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

40

2026.11.06

Postman接口请求发送教程
Postman接口请求发送教程

详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。

80

2026.11.06

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

60

2026.11.05

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

60

2026.11.05

DBeaver连接创建与配置教程
DBeaver连接创建与配置教程

本专题聚焦DBeaver数据库连接配置与管理,覆盖从新建连接、选择数据库类型到填写连接参数和验证连接的完整流程。针对MySQL、PostgreSQL、SQL Server等常见数据库,整理相应的连接设置方法,并提供驱动缺失、认证失败和连接异常等问题的排查方向。

60

2026.11.04

XORM框架结构体映射与表结构同步
XORM框架结构体映射与表结构同步

本专题围绕XORM框架的结构体映射展开,说明表名与字段的命名策略、xorm标签常用属性、主键自增与时间字段自动填充,并演示Sync2自动建表、增量字段升级、索引声明与反向生成结构体的完整流程。

60

2026.11.04

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

60

2026.11.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn