嗨 Jina,帮我画一幅高山流水图

news2024/11/14 6:00:40

本项目将 Whisper 与 Stable Diffusion 模型结合,可以直接完成语音生成图像的任务。用户可以语音输入一个短句,Whisper 会自动将语音转化为文本,接着,Stable Diffusion 会根据文本生成图像。

本项目基于 Jina AI MLOps 平台搭建,通过使用 DocArray 跨越了不同数据类型之间的鸿沟,减少了应用的数据传输成本。同时使用 Jina 搭建了一个云原生的基于微服务的 Pipeline,并且很容易就能部署到 Kubernetes 系统中。

作者:Sami Jaghouar, Alex C-G

译者:吴书凝 

原文链接:jina.ai/news/speech-to-image-generation

我们都习惯了用 Siri、天猫精灵等智能语音助手来设置闹钟,播报天气,甚至它也会给我们讲一些冷笑话。但是怎样才能更进一步呢?我们怎样才能用自己的声音作为桥梁,和世界以及机器进行更加深入、有趣的交互呢?

目前的智能语音助手都是基于单模态的,即输入我们的声音会输出它们的声音,与此同时,智能语音助手还会执行我们的指令。这种单模态的工作模式就像是钢铁侠的 Mark I。虽然对于现有的任务,智能语音助手已经完成得很好了,但是随着技术的不断革新,我们期望它能有更多的创新。

将 AI 技术赋能于语音识别系统,可以使得机器生成精美的画面,这就像是为 Alexa(亚马逊旗下的智能语音助手)装配上激光炮和火箭靴。我们也可以借此实现更加复杂的应用。

不同于单模态的智能语音助手 Alexa、Siri,通过 Jina,我们将打开多模态世界[1]的大门。我们可以利用文本生成图像,语音生成视频,甚至是任何一种模态信息生成(或者检索)另一种模态信息。

与此同时,我们不需要成为钢铁侠这样的天才,甚至无需拥有浩克一样的智力,仅仅使用 90 行代码就能使魔法变为现实。我们可以利用云原生的微服务框架完成跨模态转换任务,并将其部署在 Kubernetes 上。

初步调研

过去的几年里,人工智能技术呈爆发式发展,我们的研究也从单模态模型(例如,用于文本的 Transformers,用于图像的 Big Image Transfer)迅速转向可以同时处理不同形态数据的多模态模型。

遗憾的是,即使我们的模型已经转向多模态,这也依然过时了。就在今年,我们发现文本生成图像的工具急剧增长,例如 DiscoArt[2], DALL-E 2 和 Stable Diffusion。还有一些其他的模型甚至可以完成文本生成视频,图像生成 3D 模型的任务。

Stable Diffusion 可以用来生成图像(我们已经用它生成了以下图像):

美队骑摩托的照片

钢铁侠和Luke Skywalker跳舞的照片

Prompt:用生动的色彩,Artstation的流行趋势画一张蜘蛛侠在纽约上空飞檐走壁的4K数字插画。

现在热门的不仅是多模态的文本图像生成,就在几周前,OpenAI 发布了一个自动语音识别系统 Whisper[3]。在处理口音、背景噪声以及技术术语方面,Whisper几乎达到了人类的水准。

本文将 Whisper 与 Stable Diffusion 结合,可以直接完成语音生成图像的任务。用户可以语音输入一个短句,Whisper 会自动将语音转化为文本,接着,Stable Diffusion 会根据文本生成图像。

现有解决方案

语音生成图像并不是一个新的概念,许多学者已经写过相关的论文:

  • • S2IGAN: Speech-to-Image Generation via Adversarial Learning

  • • Direct Speech-to-Image Translation

  • • Using AI to Generate Art - A Voice-Enabled Art Generation Tool

  • • Built with AssemblyAI - Real-time Speech-to-Image Generation

与以上方案不同的是,我们的示例基于最前沿的模型,并且完全可扩展。我们的应用程序是利用微服务架构搭建的,非常容易就可以部署到 Kubernetes。更重要的是,相比于上述的解决方案,我们需要的代码量更小。

关键挑战

当思考可以用最新的多模态模型搭建什么时,你的想象可能会天马行空,但是实际的搭建不同于想象,存在几个关键问题:

1. 依赖地狱

构建一个单片机集成系统相对简单,但如果将前沿的深度学习模型绑定在一起就会导致依赖冲突。因为这些模型在搭建时为了炫技,而忽略了兼容性。这就像钢铁侠的火箭靴和激光炮并不兼容一样,当他在空中击中齐塔瑞后,火箭靴就会消失,他则像岩石一样从空中坠落。而我们将突破兼容技术,拯救钢铁侠的生命!

2. 选择数据格式

如果要处理多模态信息,只选择一种数据类型在不同模态的数据间互操作非常麻烦,而当我们只需要处理单模态信息时,文本就可以用字符串,图像就可以使用 Tensor。但是在我们的示例中需要同时处理语音和图像,如何为不同的数据类型提供一站式的解决方案是一个棘手问题。

3. 打包所有模型

最大的挑战还是在于混合不同的模型并且构建一个完全成熟的应用。当然你也可以将模型打包成容器,部署到云端并提供 API。但是一旦你想将两个模型连接在一起,创建一个稍微复杂的应用,就会出现混乱。尤其是当你想构建一个基于微服务架构的应用时,例如,复用部分 Pipeline(流水线)以避免停机,此时该如何在不同的模型之间进行通信呢?更不用说在 Kubernetes 这样的云原生平台上部署,或者监控、观测你的 Pipeline 了。

Jina 的解决方案

作为目前最先进的多模态 AI 的 MLOps 平台,Jina 生态帮助开发者和企业解决跨模态生成任务(比如:语音图像生成)面临的挑战。为了以纯净、易扩展、可部署的方式整合 Whisper 和 Stable Diffusion,我们将:

  • • 使用 Jina 将深度学习模型封装成 Executors。

  • • 将 Executors 组合后得到 Jina Flow(可复用、分片的云原生AI应用)。

  • • 使用 DocArray 将数据发送至 Flow,用 Jina Hub 上的 Executor 依次处理数据。

  • • 将应用部署到 Kubernetes/JCloud,并实现可观测性。

Pipelines 和 building blocks 不仅仅只是概念,Flow 是一个云原生应用,每个 Executor 都是一个微服务。

Jina 通过将每个 Executor 作为微服务,将 building blocks 组合 (通过模块、类分离)转化为云原生组合。这些微服务可以无缝复用和分片。Flow 和 Executors 都是由最先进的网络工具提供支持,并且依赖于双流网络。

这解决了以上提到的 3 个问题:

  • 1. 依赖地狱 -> 每个模型都被封装成单独的微服务 Executor,因此互相不干扰。

  • 2. 选择数据格式 -> DocArray 可以处理我们输入的任何数据,无论是语音、文本、图像还是其它数据格式。

  • 3. 打包所有模型 -> Jina 将模型封装成微服务 Executor后,Jina Flow 协调所有的微服务并给用户提供接口。基于 Jina 的云原生功能,我们还可以轻松将应用部署到 Kubernetes 或 JCloud,并观察和监控应用。

1. 构建 Executors

多模态检索或者生成任务都需要一些步骤构建 Executors,具体取决于你的任务。在我们的语音生成图像任务中,步骤如下:

  1. 1. 在界面中输入用户的声音。

  2. 2. 用 Whisper 将语音转换为文本。

  3. 3. 将输出的文本输入到 Stable Diffusion 中即可生成图像。

  4. 4. 在界面中显示图像。

由于我们更关注后端算法,所以我们将聚焦于步骤 2、3,并将每一个模型都封装成一个个 Executor:

  • • WhisperExecutor - 将用户的声音转化为文本。

  • • StableDiffusionExecutor - 根据文本生成图像。

在 Jina 中,Executor 是可以执行单个任务的微服务。所有 Executor 都使用 Documents 作为基本数据类型。详见“流数据”部分。

通过编写 Executors(模块/类分离)使得每个 Executor 都可以无缝地分片、复用,并部署在Kubernetes,并且他们都是可观测的。

WhisperExecutor 代码见以下代码段,其中每个函数都有自己的@requests装饰器[4],用户可以通过调用函数指定网络端口。由于我们没有指定端口,所以访问任何端口时都会调用transcribe() 。

class WhisperExecutor(Executor):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.model = whisper.load_model('base')

    @requests
    def transcribe(self, docs: DocumentArray, **kwargs):

        for (i, doc_) in enumerate(docs):
            model_output = self.model.transcribe(
                doc_.uri if doc_.tensor is None else doc_.tensor
            )
            doc_.text = model_output['text']
            doc_.tags['segments'] = model_output['segments']
            doc_.tags['language'] = model_output['language']

        return docs

2. 构建 Flow

Flow 是将 Executors 组合后得到的可以用于多/跨模态模型的 Pipeline,Documents 会进入 Pipeline,并且由 Executors 处理。

Flow 相当于配置和启动微服务架构的接口,其它的工作则是由 Executors 完成。每个 Flow 都会登录 Gateway[5](网关)服务,因此可以通过自定义的 API 连接其他服务。Gateway 将所有的 Executor 连接在一起,并且根据 Flow 的拓扑结构[6] 确保每个请求都能通过不同的 Executor(例如,它在 ExecutorB 之前进入 ExecutorA)。

语音图像生成应用的 Flow 的拓扑结构相对简单,只有两个 Executor,WhisperExecutor 和 StableDiffusionExecutor。下面的代码定义了 Flow,并且为用户提供了连接和传输数据的端口。

Flow 可以通过 flow.plot()可视化[7]。

Flow 拓扑结构

3. 流数据

进出 Flow 的所有内容都必须是 Document,Document 是 DocArray 包中的一个类。DocArray为多模态数据(我们的示例中有语音、文本、图像)提供了一个通用的 API,可以将不同模态的数据,统一成同一种数据结构。

这就意味着无论使用什么模态的数据, Document 都可以存储。并且由于所有的 Executor 使用的数据类型都是Documents 和 DocumentArrays,因此可以确保一致性。

在我们的语音图像生成任务中,输入的 Document 是用户声音的采样。Document 将采样得到的语音数据存储成 Tensor。

如果我们把输入 Document 视为doc

  1. 1. 首先会通过前端页面创建doc,接着,用户输入的声音会存储为doc.tensor

  2. 2. 通过调用 gRPC 接口,可以将doc从前端发送到 WhisperExecutor。

  3. 3. WhisperExecutor 会将接收到的 tensor 转换成 doc.text

  4. 4. 之后,doc会被发送到 StableDiffusionExecutor。

  5. 5. StableDiffusionExecutor 会读取 doc.text 并根据文本内容生成两张图像,图像将会保存在doc.matches中。

  6. 6. 紧接着,前端会接收来自于 Flow 的doc

  7. 7. 最终,前端会获取输出的 Document,并且在界面上显示出生成的图像。

用户可以通过 Flow 将 Jina客户端[8]和 第三方客户端[9] 连接起来,在我们的 示例中,Flow 启动了 gRPC 端口。并且只需一行代码,就可以轻松地将 gRPC 端口替代成 RESTful、WebSockets 或者 GraphQL 端口。此外,Gateways 被部署在 Deployment 中,用来将请求发送至 Executors。更重要的是,这些转换都是由 Jina 实时完成的。

5. 部署 Flow

Jina 作为云原生框架,和 Kubernetes 的结合最为耀眼。“用 Kubernetes 部署”的文档[10] 解释了如何在 Kubernetes 上部署 Flow,接下来让我们一起揭开帷幕,深入了解底层的原理吧。

就像之前提到的,Executor 是一个容器化的微服务。我们应用程序中的两个 Executor 都是作为 Deployment 独立部署在 Kubernetes 系统中。此外,Gateway 部署在 Deployment 中,以便请求通过 Executor。这就意味着 Kubernetes 可以处理它们的生命周期、机器调度等。更重要的是, 你只需要用 Python 定义 Flow,Jina 就会即时帮你完成部署工作。

当然你也可以在 JCloud 上部署 Flow,JCloud 也可以完成上述内容,同时它还提供了一个便捷的监视 dashboard。你只需要将 Python Flow 转换为 YAML Flow(包含一些 JCloud 的特定参数),之后就可以部署:

jc deploy flow.yaml

最终效果

现在,就是见证奇迹的时刻!输入一些测试查询:

启动监视后(默认开启),Flow 内部发生的一切都可以在 Grafana dashboard 中可视化。

监视的优势在于它可以帮助你优化应用程序,并且通过检测性能瓶颈使得你的应用程序更加经济高效。例如,以下监视结果显示:在我们的应用中,StableDiffusionExecutor 存在性能瓶颈:

这意味着负载过重会导致延时飙升。为了提高运行效率,我们可以复用 StableDiffusionExecutor,并将图像生成任务分布在不同的机器上。

f = (
Flow(port=54322)
.add(uses=WhisperExecutor)
.add(uses=StableDiffusionExecutor, uses_with={'auth_token': hf_token}, replicas=2)
)

或者可以修改 JCloud YAML 文件:

- name: diffusion
  uses: jinahub+docker://StableDiffusionExecutor
  uses_with:
    auth_token: YOUR_TOKEN
    timeout_ready: -1  # slow download speed often leads to timeout
  replicas: 2
  jcloud:
    resources:
      gpu: 1
      memory: 16

结论

本文我们用最前沿的 AI 模型和 Jina AI MLOps 平台搭建了一个云原生的语音图像生成的应用程序。

我们通过使用 DocArray 跨越了不同数据类型之间的鸿沟,减少了应用的数据传输成本。同时使用 Jina 搭建了一个原生的基于微服务的 Pipeline,并且它很容易就能部署到 Kubernetes 系统中。

由于 Jina 是一个模块化的架构,所以很容易就能将类似的方案应用到不同的用例中,例如:

  • • 搭建多模态的 PDF 搜索引擎,用户可以使用文本或图像来搜索匹配的 PDF。

  • • 构建一个多模态的时尚搜索引擎,用户可以根据文本或图像来搜索商品。

  • • 用于电影场景设计的 3D 生成模型。

  • • 基于 GPT-3 的博客生成模型。

这些应用都是云原生、易扩展的,并且非常容易部署到 Kubernetes 集群中。

引用链接

[1] 多模态世界: https://jina.ai/news/paradigm-shift-towards-multimodal-ai/
[2] DiscoArt: https://colab.research.google.com/github/jina-ai/dalle-flow/blob/main/client.ipynb
[3] Whisper: https://openai.com/blog/whisper/?utm_source=blog-speech-image
[4] request装饰器: https://docs.jina.ai/fundamentals/executor/executor-methods/?utm_source=blog-speech-image
[5] Gateway: https://docs.jina.ai/fundamentals/gateway/?utm_source=blog-speech-image
[6] Flow的拓扑结构: https://docs.jina.ai/fundamentals/flow/topologies/?utm_source=blog-speech-image
[7] 可视化: https://docs.jina.ai/fundamentals/flow/create-flow/#visualize?utm_source=blog-speech-image
[8] Jina客户端: https://docs.jina.ai/fundamentals/client/client/?utm_source=blog-speech-image
[9] 第三方客户端: https://docs.jina.ai/fundamentals/client/third-party-client/?utm_source=blog-speech-image
[10] 用Kubernetes部署文档: https://docs.jina.ai/how-to/kubernetes/?utm_source=blog-speech-image

更多资料

💻 GitHub: get.jina.ai

📖 文档docs.jina.ai

🔗 原文链:jina.ai/news/speech-to-image-generation

🧑‍💻 本项目地址github.com/jina-ai/example-speech-to-image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/32128.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一个Python爬虫案例,带你掌握xpath数据解析方法!

文章目录 xpath基本概念xpath解析原理环境安装如何实例化一个etree对象:xpath(‘xpath表达式’)xpath爬取58二手房实例爬取网址完整代码效果图xpath图片解析下载实例爬取网址完整代码效果图xpath爬取全国城市名称实例爬取网址完整代码效果图xpath爬取简历模板实例爬…

【pygame学习+实战】第一篇:游戏最小系统

14天学习训练营导师课程: 李宁《Python Pygame游戏开发入门与实战》 李宁《计算机视觉OpenCV Python项目实战》1 李宁《计算机视觉OpenCV Python项目实战》2 李宁《计算机视觉OpenCV Python项目实战》3 文章目录前言一、什么是pygame?1.1 学习pygame的用…

当我们谈论DDD时我们在谈论什么

谈论到 DDD,我们会聊事件风暴,会聊限界上下文,会聊六边形架构,会聊实体值对象。这些概念各不相同,相关的概念也很不一样,但都属于DDD的范畴。见过了很多DDD的讨论和工作坊,我发现大家唇枪舌剑无…

【同时完成超分和MEF】

Deep Coupled Feedback Network for Joint Exposure Fusion and Image Super-Resolution (用于联合曝光融合和图像超分辨的深度耦合反馈网络) 如今,人们已经习惯了拍照来记录自己的日常生活,然而,照片实际上与真实的…

SB30100LCT-ASEMI插件肖特基二极管SB30100LCT

编辑-Z SB30100LCT在TO-220AB封装里采用的2个芯片,其尺寸都是94MIL,是一款插件肖特基二极管。SB30100LCT的浪涌电流Ifsm为200A,漏电流(Ir)为12uA,其工作时耐温度范围为-55~150摄氏度。SB30100LCT采用金属硅芯片材质,里…

解决OpenCV在Cmake时,因网络问题无法下载部分所需文件

解决OpenCV在Cmake时,因网络问题无法下载部分所需文件 在安装CUDA-Opecv进行Cmake的过程中,因为网络问题很多文件都无法下载。可以在你的opencv/.cache下可以看到,很多文件都是0kb的。这样肯定是不行的,我们要保证每个文件都要下…

深入 category 数据类型

目录 前言 1 作用 2 用法 2.1通过 pd.Categorical 创建 category 类型数据,同时指定可选项 2.2 通过 dtype 参数创建 category 类型数据 2.3 此时对数据进行排序 2.4 通过 CategoricalDtype 指定 category 数据的类型顺序 2.5 想要临时修改排序规则&…

低代码开发是未来软件开发的主流模式

低代码平台起始于20世纪80年代4GL“第四代编程语言”。2014年,Forrester research 提出低代码平台的概念,中国低代码市场进入发展期;2018 年,西门子收购低代码企业 Mendix 、美国低代码独角兽企业 Outsystem 获得 1.5 亿美元的融资…

Flutter高仿微信-第22篇-支付-二维码收款(二维码)

Flutter高仿微信系列共59篇,从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图: 实现代码: /*** Author : wangning* Email : maoning20080809163.…

安装Jenkins并在ruby中访问

1. 安装Jenkins 最近不知道为啥,根据官网Linux安装Jenkins的时候下不来安装包,提示连接超时。尝试多次无果后决定在window上安装 curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo tee /usr/share/keyrings/jenkins-keyring.as…

105-120-Hadoop-MapReduce-outputformat:

105-Hadoop-MapReduce-outputformat: OutputFormat 数据输出,OutputFormat接口实现类 OutputFormat是MapReduce输出的基类,所有实现MapReduce输出都实现了 OutputFormat 接口。下面我们介绍几种常见的OutputFormat实现类。 1.O…

Fiddler利用Edxposed框架+TrustMeAlready来突破SSL pinning抓取手机APP数据

一、背景 在使用fiddler做代理抓取应用数据包时,如果要抓取到HTTPS数据,需要将fiddler证书导入到浏览器或手机。浏览器或手机设置好fiddler的代理地址,即可抓取到https数据包。 如果APP应用采用证书锁定后,将无法抓取到https数据…

[附源码]java毕业设计医院档案管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

RabbitMQ 简介

RabbitMQ 简介 首先我们先看一下常见的MQ产品 在上图我们可以知道RabbitMQ和ActiveMQ都支持AMQP协议,那么什么时AMQP呢? AMQP,即 Advanced Message Queuing Protocol(高级消息队列协议),是一个网络协议&a…

Android启动以及 app 启动流程 笔记

Android 启动流程 init 进程是 用户控件鼻祖 zygote 进程是 java进程鼻祖 zygote进程的操作 1.native 层 做的操作 1.初始化java运行环境 虚拟机 (内存管理) 2.注册jni 3.运行 zygoteinit.main方法 进入java 2.java …

Serverless Devs 社区联合信通院邀请您参加 2022 中国 Serverless 用户调查

作者:云原生产业联盟 在创新发展需求的不断驱动下,用户关注点逐步上移,敏捷成为破局高频竞争的利器。以应用为中心、屏蔽底层复杂逻辑,灵活扩展,按需取用的服务器无感知(Serverless)技术符合云…

【GUI视频教程】GUI综合实战视频教程第3期:GUIX Studio一条龙设计主界面,底栏和窗口切换控制(2022-11-21)

视频教程汇总帖:【学以致用,授人以渔】2022视频教程汇总,DSP第10期,ThreadX第5期,BSP驱动第24期,USB实战第4期,GUI实战第3期(2022-11-21) - STM32F429 - 硬汉嵌入式论坛 …

Dubbo 服务注册与启动源码解析

Dubbo 版本&#xff1a;3.1.2 自定义标签解析 在 DubboNamespaceHandler 中会添加 DubboDeployApplicationListener&#xff0c;其继承了 ApplicationListener<ApplicationContextEvent> 关于ApplicationListener&#xff0c;可参考&#xff1a;Spring 事件基本使用 服…

YoloV5+TensorRT封装|C#调用dll实现V5+TRT目标检测

在目标检测得领域中&#xff0c;yolo系列无疑是最强得目标检测框架&#xff0c;而其中得yolov5更是扛把子得存在&#xff0c;虽然有着众多的yolo系列版本&#xff0c;但是在工业领域中yolov5还是用的最多&#xff0c;yolov5 yyds&#xff0c;&#xff0c;&#xff0c;先奉献上我…

上海亚商投顾:沪指高开低走 钠离子电池、储能概念崛起

上海亚商投顾前言&#xff1a;无惧大盘大跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 三大指数今日高开低走&#xff0c;收盘均小幅下跌&#xff0c;以中字头为首的权重股走弱&#xff0c;上证50跌超0.…