使用 NiceGUI 与 Replicate 构建 AI 接口:Whisper 语音转写与 Stable Diffusion 文生图实战
2026/9/14 19:50:42 网站建设 项目流程

使用 NiceGUI 与 Replicate 构建 AI 接口:Whisper 语音转写与 Stable Diffusion 文生图实战

【免费下载链接】niceguiCreate web-based user interfaces with Python. The nice way.项目地址: https://gitcode.com/GitHub_Trending/ni/nicegui

本指南以仓库中的 AI 接口示例 为骨架,完整讲解如何用 NiceGUI 构建一个双栏 AI Web 界面:左侧基于 OpenAI Whisper 模型实现音频上传与语音转写,右侧基于 Stable Diffusion 模型实现"输入提示词生成图片"。通过本指南,你将掌握 Replicate 云端模型调用、NiceGUI 文件上传事件处理、异步 I/O 任务调度(run.io_bound)以及界面布局组合的完整实战方案。

示例概览:一个文件串联两个 AI 模型

仓库中的示例由两个文件构成,结构极为精简:

文件作用
examples/ai_interface/main.py完整的应用代码:界面布局 + 两个 AI 调用逻辑
examples/ai_interface/requirements.txt依赖清单:nicegui>=3.0replicate>=0.25

示例的核心思路是:UI 全部由 NiceGUI 构建,AI 模型则通过 Replicate 的云端 API 调用。Replicate 提供"拿来即用"的模型托管服务,只需传入模型标识(owner/name:version)与输入参数,即可同步或异步获取推理结果,无需本地部署任何深度学习模型。这正是 README 中所强调的 "very nice API to run AI models" 的落地方式。

应用在页面中并排渲染两块独立面板:

  • OpenAI Whisper(语音转写):文件上传后自动触发转写,结果实时写入页面标签;
  • Stable Diffusion(图片生成):输入提示词并点击按钮(或按回车),生成的图片以网格形式展示在页面中。

环境准备:安装依赖与配置 API Token

依赖安装

requirements.txt声明了两个运行必需的包,安装命令如下:

pip install nicegui>=3.0 replicate>=0.25
  • nicegui:本仓库的核心框架,用于构建所有 Web 组件与事件系统(本示例要求 3.0 及以上版本);
  • replicate:Replicate 的官方 Python 客户端,提供replicate.run()等高层 API。

配置 API Token

调用 Replicate 服务必须先取得访问令牌。示例代码在模块顶部通过环境变量注入 Token:

os.environ['REPLICATE_API_TOKEN'] = '...' # TODO: set your Replicate API token here
from nicegui import events, run, ui

实际操作中,建议将真实 Token 设置为系统环境变量或通过配置文件注入,避免硬编码泄露;示例中的'...'占位符需要替换为你在 Replicate 平台申请的 Token。

语音转写:用 Whisper 处理上传的音频

上传组件与事件回调

Whisper 面板的构建代码非常简洁:

with ui.column().classes('w-100 items-stretch'): ui.label('OpenAI Whisper (voice transcription)').classes('text-2xl') ui.upload(on_upload=transcribe_audio, auto_upload=True) transcription = ui.label().classes('text-xl')

ui.upload是 NiceGUI 基于 QuasarQUploader封装的文件上传组件。从 上传组件源码 可以看到它支持丰富的参数,示例中用到的两个关键参数说明如下:

参数默认值作用
on_uploadNone每个文件上传完成后触发,回调收到UploadEventArguments事件对象
auto_uploadFalse设为True时,文件被选中后立即自动上传,无需额外点击上传按钮

on_upload外,组件还提供on_begin_upload(上传开始)、on_multi_upload(全部文件上传完成)、on_rejected(文件被拒绝)等事件;另可通过multiplemax_file_sizemax_total_sizemax_files等参数控制多文件与大小限制。

从事件定义源码 nicegui/events.py 可以看到,UploadEventArguments携带一个file: FileUpload字段,回调内通过e.file.read()读取文件二进制内容。

转写逻辑:异步 I/O 调度

async def transcribe_audio(e: events.UploadEventArguments): transcription.text = 'Transcribing...' output = await run.io_bound( replicate.run, 'openai/whisper:8099696689d249cf8b122d833c36ac3f75505c666a395ca40ef26f68e7d3d16e', input={'audio': io.BytesIO(await e.file.read())}, ) transcription.text = output.get('transcription', 'Transcription failed.')

这段代码演示了三个重要实践:

  1. 即时状态反馈:上传事件触发后,先将标签文本置为'Transcribing...',让用户感知任务已开始;
  2. 模型调用放在run.io_bound中执行replicate.run是一次网络请求,属于 I/O 密集型操作。run.io_bound会将其调度到独立的线程池中执行,避免阻塞 NiceGUI 的事件循环。从 run.py 源码 可以看到,其底层实现是通过asyncio.get_running_loop().run_in_executor(thread_pool, ...)把同步函数交给线程池,从而让async def处理器既能await同步库调用,又不卡住 UI;
  3. 异步读取上传文件await e.file.read()读取上传的音频二进制,再包装为io.BytesIO作为 Whisper 模型的audio输入参数。

replicate.run的模型标识串是完整格式模型作者/模型名:版本哈希,该版本哈希锁定了 Whisper 的具体 checkpoint,保证调用结果的确定性。返回的output是字典,示例通过output.get('transcription', 'Transcription failed.')提取转写文本,并在取不到结果时给出兜底提示。

文生图:用 Stable Diffusion 生成图片

输入、按钮与加载态

with ui.column().classes('w-100 items-stretch'): ui.label('Stable Diffusion (image generator)').classes('text-2xl') prompt = ui.input('Your prompt').on('keydown.enter', generate_image) image_button = ui.button('Generate image', on_click=generate_image) images = ui.column()

这里组合了三个 NiceGUI 组件:

  • ui.input('Your prompt'):提示词输入框,通过.on('keydown.enter', generate_image)绑定键盘事件,在输入框内按回车即可直接触发生成
  • ui.button('Generate image', on_click=generate_image):生成按钮,点击触发同样的回调;
  • ui.column():用作图片输出容器,生成结果将被动态追加到其中。

生成逻辑:loading 状态与结果渲染

async def generate_image(): image_button.props('loading') output = await run.io_bound( replicate.run, 'stability-ai/stable-diffusion:db21e45d3f7023abc2a46ee38a23973f6dce16bb082a930b0c49861f96d1e5bf', input={'prompt': prompt.value}, ) image_button.props(remove='loading') images.clear() for image in output: ui.image(image.url).classes('w-100 border border-gray-300 rounded-md')

关键点拆解:

  1. 按钮 loading 态:调用前通过image_button.props('loading')给按钮添加 Quasar 的loading属性(禁用并显示加载动画),调用结束后用image_button.props(remove='loading')移除,避免生成期间用户重复点击;
  2. 同样的run.io_bound调度:Stable Diffusion 推理同样是远程 HTTP 调用,与转写逻辑一样放入线程池执行,等待期间界面保持可响应;
  3. 结果渲染:Replicate 的 Stable Diffusion 模型返回一个可迭代的输出序列,每个元素是图片对象,示例遍历输出并逐个用ui.image(image.url)展示,同时通过.classes('w-100 border border-gray-300 rounded-md')应用宽度 100%、灰色边框与圆角样式;
  4. 旧结果清理images.clear()在生成新图前清空容器,保证每次生成只展示最新结果。

从 图片组件源码 可以看到,ui.imagesource参数支持 URL、本地文件路径、Base64 字符串或 PIL 图像,这里直接传入 Replicate 返回的图片 URL 即可。

界面布局:Row + Column 双栏结构

with ui.row().classes('gap-16'): with ui.column().classes('w-100 items-stretch'): # ... Whisper 面板 with ui.column().classes('w-100 items-stretch'): # ... Stable Diffusion 面板

布局采用 NiceGUI 典型的上下文管理器语法:

  • ui.row():水平排列两个子面板,gap-16为 Quasar/UnoCSS 间距工具类,控制两栏间距;
  • 每个ui.column():垂直堆叠面板内部元素,w-100 items-stretch让子元素占满宽度并拉伸对齐;
  • 面板标题使用text-2xl/text-xl工具类区分层级(面板标题与状态文本)。

运行与验证

启动应用

在示例目录下执行:

python main.py

NiceGUI 会启动本地开发服务器(默认http://localhost:8080),浏览器打开后即可看到双栏界面。启动前请确保已正确设置REPLICATE_API_TOKEN,否则调用模型时会收到鉴权错误。

交互流程验证

  1. 转写验证:在左侧上传一个音频/视频文件(auto_upload=True会自动开始上传),状态标签先显示Transcribing...,随后替换为 Whisper 返回的转写文本;若失败则显示Transcription failed.
  2. 生成验证:在右侧输入提示词(如 "Create a nicegui logo"),点击按钮或按回车,按钮进入 loading 态,输出区先显示生成中的占位内容,完成后渲染返回的图片。

仓库中的 screenshot.webp 展示了上述完整界面与交互状态。

源码级原理补充

为了让读者理解示例背后 NiceGUI 的支撑机制,这里补充三处源码事实:

  1. run.io_bound与线程池:见 nicegui/run.py,io_bound将回调放入全局ThreadPoolExecutor,通过run_in_executor与 asyncio 事件循环桥接,因此可以安全地在async处理器中await同步的 Replicate 调用。若任务在应用关闭或取消时未完成,会返回None(这是当前版本的过渡行为,4.0 将改为抛出CancelledError),示例代码通过字典的get兜底与 loading 属性管理规避了这类边界情况。同类 API 还有run.cpu_bound(放入独立进程池),适合本地 CPU 密集计算场景;
  2. 上传事件的完整链路ui.upload在客户端通过注册的内部路由/_nicegui/client/{client.id}/upload/{element.id}将文件 POST 到服务端,服务端解析 multipart 表单后按顺序触发on_begin_uploadon_uploadon_multi_upload事件(见 upload.py 与 events.py 的UploadEventArguments定义);
  3. ui.image的渲染能力Image元素基于 QuasarQImg封装,source支持多种输入类型(URL / 路径 / Base64 / PIL 图像),并额外提供force_reload()方法用于强制刷新网络图片(见 image.py)。

小结与扩展建议

本示例用约 40 行 Python 代码完成了"上传音频 → 语音转写"与"输入提示词 → 生成图片"两个完整的 AI 工作流,其可迁移的通用模式包括:

  • run.io_bound包裹远程模型调用,保持 UI 事件循环不被阻塞,是接入任意 HTTP/云端 AI 服务的标准姿势;
  • ui.uploadauto_upload+on_upload组合,适合"选择即处理"的文件驱动型任务;
  • props('loading')/props(remove='loading')动态切换按钮状态,为长时间推理任务提供基础的用户体验保障。

在此基础上可以继续扩展:为转写面板增加多文件支持(multiple=True)、为生成结果增加下载链接(结合ui.download)、或使用run.cpu_bound将本地后处理(如图片裁剪、字幕对齐)放入进程池执行。完整的可运行代码位于 examples/ai_interface/main.py,依赖清单见 examples/ai_interface/requirements.txt,可供直接参考与二次开发。

【免费下载链接】niceguiCreate web-based user interfaces with Python. The nice way.项目地址: https://gitcode.com/GitHub_Trending/ni/nicegui

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询