第 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 #源码解析 #多模态 #图像生成 #音频转录

相关推荐
码点滴32 分钟前
67000 星的开源语音引擎:用 VoiceStudio 搭建本地语音克隆与多语言配音流水线
开源·音视频
开开心心就好1 小时前
手机虚拟化学实验室,混合燃烧都能模拟
jupyter·智能手机·ffmpeg·计算机外设·电脑·音视频·visual studio
VidDown2 小时前
上线三个月后的第一次事故:一个 Django 服务的日志、监控与故障复盘
数据库·python·django·wpf·音视频·视频编解码
donk13142 小时前
React Native for OpenHarmony 实战:三方库 react-native-toast-message 的鸿蒙化适配指南
react native·react.js·音视频·harmonyos
VidDown2 小时前
用户说“卡顿“,服务器一切正常:播放质量监测与 QoE 指标
运维·服务器·ffmpeg·音视频·视频
一楼的猫3 小时前
第十一届中国教育后勤展览会杭州开幕 夏拾光影像为阿里、淘宝闪购提供云相册直播与视频服务 - 夏拾光影像
大数据·人工智能·音视频
开开心心就好3 小时前
手机电池健康怎么查?看容量温度循环次数
spring·智能手机·ffmpeg·计算机外设·电脑·maven·音视频
林墨聊AIGC6 小时前
AI短剧分镜图生成后下一步:从AI到成片的完整制作流程高效策略
大数据·人工智能·ai作画·aigc·音视频·ai写作
VidDown15 小时前
24fps 转 25fps 不只是改个数字:帧率转换、PAL/NTSC 与音频补偿
python·网络协议·音视频·视频编解码·视频
美狐美颜SDK开放平台18 小时前
直播APP如何实现美白滤镜功能?视频美颜SDK技术开发方案详解
前端·数据库·人工智能·音视频·美颜sdk·直播美颜sdk·视频美颜sdk