aiogram InlineQueryResultVoice 详解:在 Telegram 内联查询中返回 OPUS 语音结果

发布时间:2026/10/13 2:59:51

aiogram InlineQueryResultVoice 详解:在 Telegram 内联查询中返回 OPUS 语音结果 后端即时通讯API设计【免费下载链接】aiogramaiogram is a modern and fully asynchronous framework for Telegram Bot API written in Python using asyncio项目地址https://gitcode.com/gh_mirrors/ai/aiogram点击查看免费下载本文围绕 aiogram 中InlineQueryResultVoice这一内联查询结果类型展开介绍它如何在inline_query事件中构造、通过answer_inline_query方法返回给 Telegram 客户端并深入解析其全部字段语音 URL、标题、字幕、解析模式、内联键盘与自定义消息内容及底层源码实现。读者读完即可在 aiogram 项目中实现输入关键字 → 返回可播放语音的完整内联查询流程。InlineQueryResultVoice表示一条指向.OGG 容器OPUS 编码语音录制文件的链接属于 Telegram Bot API 内联查询结果InlineQueryResult的 20 种类型之一。在 aiogram 中该类型定义在 aiogram/types/inline_query_result_voice.py其 API 文档由 docs/api/types/inline_query_result_voice.rst 通过 Sphinxautomodule自动生成。一、类型定位内联查询结果家族的一员在 Telegram 的内联模式inline mode下用户在聊天输入框直接输入你的机器人 关键字机器人需要在一秒内返回最多 50 条候选结果供用户点选发送。InlineQueryResultVoice就是这些候选结果中负责语音形态的一种。从源码结构看aiogram 用一个抽象基类统一了所有内联查询结果InlineQueryResult定义于 aiogram/types/inline_query_result.py它的类文档明确列出当前支持的 20 种结果类型包括 cached 系列的InlineQueryResultCachedAudio/CachedDocument/CachedGif/CachedPhoto/CachedVideo/CachedVoice以及非 cached 系列的InlineQueryResultArticle/Audio/Contact/Game/Document/Gif/Location/Mpeg4Gif/Photo/Venue/Video/Voice等。InlineQueryResultVoice是其中之一继承自InlineQueryResult而后者继承自MutableTelegramObject即 pydantic 模型基类。这些具体类型会进一步汇入联合类型InlineQueryResultUnionaiogram/types/inline_query_result_union.py供answer_inline_query方法的results参数使用因此在构造结果时你既可以直接使用InlineQueryResultVoice(...)也可以借助类型提示获得results参数的 IDE 补全。类型标记本身由枚举InlineQueryResultType提供aiogram/enums/inline_query_result_type.py其中VOICE voice与 Bot API 的 JSON 字段值一一对应。二、字段全景从必填项到可选增强项InlineQueryResultVoice在源码中是一个标准 pydantic 模型TYPE_CHECKING分支内的__init__由butcher自动生成仅供 IDE 类型检查使用。完整字段定义如下字段类型必填说明typeLiteral[InlineQueryResultType.VOICE]是固定为voice序列化时无需手动传值idstr是结果唯一标识1-64 字节voice_urlstr是语音录制文件的有效 URL.OGG/OPUStitlestr是录制标题captionstr \| None否字幕0-1024 字符实体解析后parse_modestr \| Default \| None否字幕实体解析模式默认Default(parse_mode)caption_entitieslist[MessageEntity] \| None否字幕中的特殊实体列表可替代parse_modevoice_durationint \| None否录制时长秒reply_markupInlineKeyboardMarkup \| None否附加在消息上的内联键盘input_message_contentInputMessageContentUnion \| None否点选后发送的自定义消息内容替代语音本身对应源码位置为 aiogram/types/inline_query_result_voice.py。下面逐类说明关键字段的语义与使用注意点。1. 三个必填字段id、voice_url、title构造一个合法的InlineQueryResultVoice至少要提供id每条结果在单次查询内必须唯一且限制在 1-64 字节voice_urlTelegram 服务器会代表用户抓取该 URL 并作为语音发送因此必须指向可公开访问的 .OGGOPUS 编码文件title展示给用户的录制标题。2. 字幕相关caption、parse_mode、caption_entitiescaption是可选的语音字幕0-1024 字符。字幕的富文本解析有两种互斥的指定方式parse_mode值为HTML或MarkdownV2以及其他格式化选项字符串型的值直接生效caption_entities一个MessageEntity列表aiogram/types/message_entity.py显式标注实体范围如bold、text_link、custom_emoji等适合对解析精确度要求较高的场景。两者同时出现时caption_entities优先于parse_mode。值得特别注意的是parse_mode的默认值Default(parse_mode)。这是 aiogram 3.x 引入的延迟解析默认值机制——Default类定义于 aiogram/client/default.py它不是一个普通字符串而是一个携带名字的占位对象。真正生效的取值由 Bot 级配置DefaultBotProperties.parse_mode同一个文件中定义决定如果你在创建 Bot 时设置了全局parse_modeHTML那么这里即使不显式传parse_mode字幕也会按 HTML 解析如果你希望显式关闭解析例如字幕里有不需要转义的原始文本则需传入parse_modeNone。3.voice_duration显示用时长voice_duration为录制时长秒属于纯展示性信息用于在客户端展示语音时长。源码注释仅说明其为Recording duration in seconds具体取值范围由 Bot API 决定。4.reply_markup点选后附带内联键盘reply_markup接收InlineKeyboardMarkupaiogram/types/inline_keyboard_markup.py其核心结构是inline_keyboard: list[list[InlineKeyboardButton]]按钮行数组。这在语音结果发送后需要附带查看详情下载原文件等操作按钮时非常有用。5.input_message_content替换语音为自定义消息input_message_content是本类型中最具扩展性的字段它让用户点选结果后不发送语音文件而是改发一条指定内容的消息。其类型是InputMessageContentUnionaiogram/types/input_message_content_union.py联合了InputTextMessageContent纯文本消息1-4096 字符见 aiogram/types/input_text_message_content.pyInputLocationMessageContent、InputVenueMessageContent、InputContactMessageContent、InputInvoiceMessageContent、InputRichMessageContent分别对应位置、场所、名片、发票与富文本消息。在 aiogram 3.x 中这些输入消息内容同样是 pydantic 模型且大多带有parse_mode、link_preview_options等默认值字段。三、完整实战在 inline_query 事件中返回语音把上述字段串起来的完整链路是用户触发 inline query → 你的inline_query事件处理器收到查询 → 构造InlineQueryResultVoice→ 调用answer_inline_query返回结果。inline_query事件由路由器注册见 aiogram/dispatcher/router.py 中的self.inline_query TelegramEventObserver(routerself, event_nameinline_query)。事件对象InlineQuery带有query用户输入文本与from_user等属性你也可以使用 aiogram/handlers/inline_query.py 提供的InlineQueryHandler基类self.query是self.event.query的别名编写类风格处理器。一个最小可用示例from aiogram import Bot, Dispatcher, Router from aiogram.types import ( InlineQuery, InlineQueryResultVoice, InputTextMessageContent, ) from aiogram.methods import AnswerInlineQuery router Router() router.inline_query() async def handle_inline_query(query: InlineQuery) - AnswerInlineQuery: # 仅当用户输入了关键字时才响应 if not query.query: return query.answer( results[], cache_time1, is_personalTrue, ) return query.answer( results[ InlineQueryResultVoice( idvoice_1, # 1-64 字节唯一标识 voice_urlhttps://example.com/a.ogg, # .OGG / OPUS 编码 title今日播报, caption每日语音简报b欢迎收听/b, # 若 Bot 全局 parse_mode 为 HTML 则直接生效 voice_duration95, reply_markupNone, input_message_contentInputTextMessageContent( message_text语音全文摘要……, ), ), ], cache_time5, ) async def main() - None: bot Bot(tokenBOT_TOKEN) dp Dispatcher() dp.include_router(router) await dp.start_polling(bot)其中的query.answer(...)是事件对象的便捷方法其底层就是调用answerInlineQuery方法对应 aiogram 的AnswerInlineQuery方法类定义于 aiogram/methods/answer_inline_query.py。AnswerInlineQuery的results参数类型为list[InlineQueryResultUnion]并支持以下辅助参数cache_time结果可被服务端缓存的秒数默认 300is_personal为True时结果仅对发起查询的用户缓存next_offset分页偏移量用于同一个文本再次查询时获取更多结果空字符串表示无更多结果或不做分页长度不超过 64 字节buttonInlineQueryResultsButton展示在结果上方的按钮switch_pm_parameter/switch_pm_text旧版切换到私聊按钮参数已在 API 6.72023-04-21中标记弃用。四、源码级细节与注意事项1. 模型与类型系统InlineQueryResultVoice继承链为InlineQueryResult→MutableTelegramObjectpydanticBaseModel子类。所有字段均为关键字参数且type字段被标注为Literal[InlineQueryResultType.VOICE]并预设默认值InlineQueryResultType.VOICE因此构造时无需也不应重复传入type——序列化时它会被正确输出为字符串voice。TYPE_CHECKING块中的__init__由butcher工具自动生成运行时仍走 pydantic 的默认初始化逻辑。2. URL 的公开性由于内联查询结果的 URL 会被 Telegram 服务器抓取、并且展示给终端用户InlineQueryResult基类的文档注释特别强调All URLs passed in inline query results will be available to end users and therefore must be assumed to bepublic。因此voice_url指向的文件应确保可公开访问不要使用带私有鉴权的内网地址。3. 数量与时效限制AnswerInlineQuery的类文档明确规定每次查询最多返回 50 条结果同时 Telegram 要求机器人尽快应答约 1 秒窗口超时后客户端会提示无结果。因此构造InlineQueryResultVoice时应配合cache_time与next_offset做缓存和分页避免在大结果集场景下超时。4. 测试佐证内联查询结果的用法在仓库测试中有直接佐证tests/test_api/test_methods/test_answer_inline_query.py 展示了通过bot.answer_inline_query(inline_query_id..., results[InlineQueryResultArticle(...)])应答查询并断言返回True的完整流程examples/web_app/routes.py 则展示了在 Web App 场景下用InlineQueryResultArticleInputTextMessageContentInlineKeyboardMarkup构造结果的实践写法InlineQueryResultVoice的构造方式与之一致仅将结果类型与必填字段替换为语音相关字段。五、与邻近类型的区分在使用中容易混淆的是同属声音类的另外两个类型InlineQueryResultAudio指向 MP3 等常规音频文件展示为可播放的音频消息InlineQueryResultCachedVoice直接引用已经通过sendVoice等方式缓存在 Telegram 服务器上的voice 文件file_id无需再次提供 URL。三者定位不同InlineQueryResultVoice适合每次查询动态拼接外部 URLInlineQueryResultCachedVoice适合复用已上传文件、免去重复抓取InlineQueryResultAudio则是更通用的音乐/音频形态。选择依据是内容形态语音 vs 音乐与文件是否已在 Bot 侧缓存。小结InlineQueryResultVoice是 aiogram 内联查询结果家族中专门承载 OPUS 语音的成员围绕它的开发闭环可以概括为注册inline_query事件 → 按需构造InlineQueryResultVoice必填id/voice_url/title可选caption/parse_mode/caption_entities/voice_duration/reply_markup/input_message_content→ 通过answer_inline_queryresults列表最多 50 条返回。理解其Default(parse_mode)默认值机制、InputMessageContentUnion替换能力以及 URL 公开性约束即可在真实机器人中稳定落地语音内联搜索功能。赞分享后端即时通讯API设计【免费下载链接】aiogramaiogram is a modern and fully asynchronous framework for Telegram Bot API written in Python using asyncio项目地址https://gitcode.com/gh_mirrors/ai/aiogram点击查看免费下载相关推荐aiogram InlineQueryResultAudio 详解在 Telegram 内联查询中返回 MP3 音频结果aiogram InlineQueryResultAudio 详解在 Telegram 内联查询中返回 MP3 音频结果 本文以 aiogram 框架的 In后端即时通讯API设计AWS Amplify PubSub 包演进深度解析从 aws-amplify/pubsub 变更日志读懂 MQTT/IoT 实时通信的实现与升级要点AWS Amplify PubSub 包演进深度解析从 aws amplify/pubsub 变更日志读懂 MQTT/IoT 实时通信的实现与升级要点 本文后端即时通讯API设计Airtest 图像识别核心模块 airtest.core.cv 深度解析Template 匹配、CVSTRATEGY 与多尺度搜索原理Airtest 图像识别核心模块 airtest.core.cv 深度解析Template 匹配、CVSTRATEGY 与多尺度搜索原理 Airtest 是一后端即时通讯API设计上一篇网盘直链下载助手覆盖 8 大网盘的直链下载完整指南下一篇Vue-CRM免费客户关系管理系统5分钟跑起一套完整CRM创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/13 2:59:51

PXI6232多功能数据采集模块搭建多点温度采集系统实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 5:35:00

三菱FX3U自动门控制全解析:从I/O分配到仿真调试与现场整定

上周去现场调一套商场平移门的改造,甲方拍着胸脯说:“就电机正反转,PLC控制,带防夹,一天能搞完。”结果从IO分配到仿真验证,再到现场整定,我整整蹲了三天。自动门系统控制确实不是什么高深技术&…

2026/10/13 5:35:00

Scala Map实战指南:从创建遍历到groupBy与并发避坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 5:35:00

BC28模组MQTT接入ONENET实战:避坑指南与低功耗优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 5:35:00

iOS原生侧滑菜单实现原理与工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 5:35:00

STM32F407芯片架构深度解析:总线矩阵、CCM RAM与ART加速器实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 5:30:00

从I²C到PCIe:计算机总线协议选型与体系结构全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 5:19:27

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/12 12:01:26

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/12 12:54:07

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/13 0:04:41

基于Triton部署YOLO目标检测:从训练脚本到线上服务

简介:这份资源面向希望将目标检测模型落地到生产环境的深度学习开发者与算法工程师,聚焦于用 Triton Inference Server 部署 YOLOv9 的完整实战方案,解决从训练权重到线上推理服务之间的工程化难题。压缩包共 16 个文件,约 886KB&…

2026/10/13 0:04:41

手把手教你云端部署Qwen-Image-2.1:从GPU选型到在线文生图服务

Qwen-Image-2.1 这个开源的图像生成模型,最近在内容创作和 AI 应用圈子里热度相当高。它属于通义 Qwen 系列里的视觉生成分支,让我眼前一亮的是它对中文长文本的理解能力——以前用那些老方案生成带中文文字的图,十个里九个是“乱码印刷体”&…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑