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

相关推荐
Mr数据杨2 小时前
【Codex】接入音频转录服务实现课堂语音结构化处理
django·音视频·codex·项目开发
ALINX技术博客3 小时前
【黑金云课堂】FPGA技术教程FPGA 基础:HDMI视频输入与环路输出实验
fpga开发·音视频
揽秀亭长3 小时前
做视频时如何快速完成视频转文字?几种方法实测
人工智能·音视频
可乐鸡翅yeah_4 小时前
hls.js 多实例并发踩坑,多视频页面播放器内存与冲突问题解决
开发语言·前端·javascript·音视频·hls·m3u8·m3u8在线播放
AI服务老曹4 小时前
算法任务配置完整流程:明厨亮灶项目从0到1怎么做 | AI视频分析算法实践
人工智能·算法·音视频
AI创界者4 小时前
【开源实战】FaceFusionFree 5.3 部署与进阶:修复内存模式条纹 Bug 与帧率对齐逻辑解析
人工智能·aigc·音视频
声浪数字4 小时前
Vlog、测评、剧情、混剪:四类视频的音效网站各去哪找
音视频
m0_6145235514 小时前
完整教程|输入一句描述,能不能直接生成一段可以继续剪辑的视频:写结构化描述到生成短样片
人工智能·音视频
揽秀亭长18 小时前
视频转文字工具对比:从字幕生成到文本整理
人工智能·音视频