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

相关推荐
美狐美颜SDK开放平台3 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
2601_955662463 天前
短剧多人对白怎么配?2026年多角色配音工具对比
大数据·人工智能·音视频·语音识别
开发笔记-阿牛3 天前
蓝牙音乐灯拆解,又一次拆到蓝牙音乐灯芯片CK6865L
人工智能·单片机·嵌入式硬件·音视频·音频
旺仔小馒头wang3 天前
AI 智能手机发布会:赋予人类的五种新能力
人工智能·学习·音视频
纳祥科技3 天前
拆机拆到芯片级:ARC功放机里的NX7026、NX8420、NX6805
单片机·音视频·智能音箱
youandyouyou3 天前
律所内部培训共享的内网部署方案:架构、参数与三步落地
音视频
爱吃提升3 天前
文生视频核心
人工智能·音视频
2601_955662463 天前
抖音视频怎么做多语言配音?2026年AI配音工具与制作流程详解
人工智能·音视频·语音识别·视频
音视频牛哥3 天前
Android与HarmonyOS NEXT如何接入GB28181:从SIP到PS/RTP的完整链路
音视频·gb28181-2022对接·鸿蒙next gb28181·gb/t 28181-2022·gb/t 28181-2016·gb28181-2022平台
美狐美颜SDK开放平台3 天前
直播APP源码与视频美颜sdk如何配合?一套完整开发思路
android·人工智能·计算机视觉·音视频·直播美颜sdk