第 21 章《图像生成与音频转录》· nanobot 多模态 Provider 源码解析:11 图像 + 6 转录注册表

本文回答什么问题:nanobot 怎么支持图像生成?怎么支持音频转录?多模态 Provider 怎么注册?和 LLM Provider 什么关系?

目标读者 :想加多模态能力的开发者

预计阅读时间 :10 分钟

源码版本 :GitHub HKUDS/nanobot main 分支主线代码(仓库相对路径)

nanobot 把"图像生成"和"音频转录"独立成 2 个 Provider 接口,与 LLM Provider 并列。本章聚焦这两个独立接口的设计。

1. 整体定位:为什么多模态独立

LLM Provider 接口(chat(messages, tools))只能输出文本。但 LLM Tool 可能需要:

  • 生成图像(image tool 调用)
  • 转录音频(audio tool 处理附件)

如果把多模态塞进 chat(),LLMProvider 抽象就膨胀。独立接口保持 LLMProvider 简洁,多模态各管各。

核心要点速查(建议收藏)

  • 核心文件 :nanobot/providers/image_generation.py(约 200 行)+ nanobot/audio/transcription.py(约 150 行)
  • 2 个独立接口 :ImageGenerator.generate(prompt, ...) / Transcriber.transcribe(audio_path, ...)
  • 图像后端 11 个(DALL-E / SD / Imagen / 等)
  • 音频后端 6 个(Whisper / Deepgram / Google / 等)
  • 与 LLM 关系 Tool 调用 image / audio,内部走注册表

2. ImageGenerator 接口

python 复制代码
# nanobot/providers/image_generation.py L20-L80
from abc import ABC, abstractmethod

class ImageGenerator(ABC):
    @abstractmethod
    async def generate(
        self,
        prompt: str,
        *,
        size: str = "1024x1024",
        n: int = 1,
        model: str | None = None,
    ) -> list[ImageResult]:
        """生成图像。返回 URL 或 base64。"""

@dataclass
class ImageResult:
    url: str  # https://... 或 base64://...
    revised_prompt: str  # DALL-E 3 自动改写后的 prompt
    model: str

11 个内置后端(L82-L130):

后端 模型 适用
OpenAIImage DALL-E 2/3 OpenAI 通用
StabilityAI SDXL / SD3 自托管友好
Replicate 任意 SD 模型 多模型聚合
BlackForestLabs FLUX 高质量
Together 多模型 便宜
Fireworks 多模型 快
LeptonAI 多模型 自托管
AzureDALLE DALL-E Azure 部署
BedrockStable SDXL AWS
VertexImagen Imagen GCP
Unconfigured 占位 未配置

3. Transcriber 接口

python 复制代码
# nanobot/audio/transcription.py L20-L60
class Transcriber(ABC):
    @abstractmethod
    async def transcribe(
        self,
        audio_path: Path | bytes,
        *,
        language: str = "auto",
        model: str | None = None,
    ) -> TranscriptResult:
        """转录音频。返回文本 + 时间戳。"""

@dataclass
class TranscriptResult:
    text: str
    segments: list[Segment]  # [{start, end, text}]
    language: str
    model: str

6 个内置后端:

后端 模型 适用
OpenAIWhisper whisper-1 通用
Deepgram nova-2 实时流
GoogleSpeech Chirp 多语种
AzureSpeech 多模型 Azure
BedrockWhisper whisper AWS
LocalWhisper whisper.cpp 本地

4. 注册表(类似 LLM Provider)

python 复制代码
IMAGE_GENERATORS = {
    "openai": OpenAIImage,
    "stability": StabilityAI,
    "replicate": Replicate,
    # ...
}

TRANSCRIBERS = {
    "openai_whisper": OpenAIWhisper,
    "deepgram": Deepgram,
    # ...
}

与 LLM Provider 共用 ProviderSpec 模式(详见第 18 章)。

5. Tool 怎么调用

python 复制代码
# nanobot/agent/tools/image.py
class ImageGenTool(Tool):
    async def execute(self, *, prompt: str, n: int = 1) -> ToolResult:
        generator = self._registry.get("image", self._spec.image_backend)
        results = await generator.generate(prompt=prompt, n=n)
        # 返回 markdown 嵌入图像
        return ToolResult(content=f"![image]({results[0].url})")
python 复制代码
# nanobot/agent/tools/audio.py
class AudioTool(Tool):
    async def execute(self, *, audio_path: str) -> ToolResult:
        transcriber = self._registry.get("transcription", self._spec.audio_backend)
        result = await transcriber.transcribe(audio_path)
        return ToolResult(content=result.text)

6. 实战:启用多模态

yaml 复制代码
# config.yaml
imageBackend: openai
transcriptionBackend: openai_whisper

providers:
  openai:
    apiKey: "sk-..."
bash 复制代码
# LLM 自动用 image 工具生成图像
nanobot chat --text="生成一张日落海滩的图像"

7. 实战:加自定义后端

python 复制代码
# nanobot/providers/my_image.py
from nanobot.providers.image_generation import ImageGenerator, ImageResult

class MyImageGenerator(ImageGenerator):
    async def generate(self, prompt, *, size="1024x1024", n=1, model=None):
        # 调你自己的 SDK
        return [ImageResult(url="https:  # ...", revised_prompt=prompt, model="my-model")]

# 注册
IMAGE_GENERATORS["my"] = MyImageGenerator

8. 4 个常见误区

误区 1 · 多模态会消耗很多 token?

A :图像通常不算 token(输出独立)。但有些 LLM(Claude / GPT-4V)接收图像作为输入时算 token。

误区 2 · DALL-E 3 输出 URL 过期?

A:------DALL-E URL 1 小时过期。要永久保存需下载到本地。

误区 3 · Whisper 支持中文吗?

A 😦whisper-1 自动识别 99 种语言)。但中文用 language="zh" 提高准确率。

误区 4 · 图像生成能调多次吗?

A :n=4 生成 4 张。但 LLM Tool 调用默认 n=1(避免生成多张浪费)。

9. 小结

  • 2 个独立接口 ImageGenerator / Transcriber
  • 11 图像后端 + 6 转录后端 内置
  • Tool 调用 image / audio tool
  • 自定义 注册新后端

本文要点速查

  1. 2 个独立接口 见 §2-3
  2. 后端清单 见 §2 + §3
  3. Tool 怎么调 见 §5
  4. 下一步:第 22 章《BaseChannel 抽象》------ 跳出 LLM Provider,看聊天通道

按角色推荐
  • 聊天通道开发者:选读(知道多模态后端)
  • LLM Agent 开发者:选读(知道 image / audio tool)
  • 系统架构师:选读
  • Tool / MCP 工具开发者:必读(自定义图像 / 音频工具必读)
  • LLM Provider 适配者:选读
下一步
  • 第 22 章《BaseChannel 抽象与 ChannelManager》 ------ 17 通道的统一契约(主题群"聊天通道",第 4 周)

tags :#nanobot #AI Agent #LLM #Python #源码解析 #多模态 #图像生成 #音频转录

相关推荐
MetaEnchanter8 小时前
视频章节怎么整理:填好时间点,导出前检查这几处
音视频
小豆庄11 小时前
测试视频里的人脸车牌敏感信息自动化脱敏方案
计算机视觉·目标跟踪·ffmpeg·音视频·边缘计算·视频·敏捷流程
光泽雨12 小时前
WPF 音视频四大核心方案对比
wpf·音视频
揽秀亭长13 小时前
音频转乐谱如何实现?四类AI 扒谱工具的流程
音视频
敢敢のwings1 天前
SimpleMemVLA 深度解读:把原生视频上下文变成机器人的记忆
数码相机·机器人·音视频
ck0135792 天前
视频片段提取与视频修剪的区别:多时间段选择及导出流程
人工智能·音视频·视频
沐飞工具箱2 天前
游戏、漫画、视频里的外语怎么实时翻译?从 OCR + AI 原理聊聊 VoriTrans 屏幕翻译
人工智能·游戏·实时互动·音视频·自动翻译
小豆庄2 天前
监控视频脱敏的追踪漂移与ID撞号陷阱
目标跟踪·ffmpeg·音视频·视频·敏捷流程
原子延迟2 天前
批量压缩视频会变大?HandBrake等3款(2026)
图像处理·人工智能·计算机视觉·音视频
TST-魚爷2 天前
腾讯会议双机位同屏:前后两个摄像头画面合并显示方案(易视讯)
电脑·音视频·腾讯会议·zoom会议