这个项目结合了Whisper和StableDiffusion模型,可以直接完成语音生成图像的任务。用户可以通过语音输入一个简短的句子,Whisper会自动将语音转换为文本,然后StableDiffusion会根据文本生成图像。该项目建立在JinaAIMLOps平台上。通过使用DocArray,弥合了不同数据类型之间的差距,降低了应用程序的数据传输成本。同时,使用Jina构建了一个基于云原生微服务的Pipeline,可以方便的部署到Kubernetes系统中。我们都习惯使用Siri、天猫精灵等智能语音助手来设置闹钟、播报天气,甚至给自己讲一些冷笑话。但是如何才能走得更远呢?我们如何以声音为桥梁,与世界和机器进行更深入、更有趣的互动?目前的智能语音助手都是基于单一模式,即输入我们的声音就会输出他们的声音,同时智能语音助手也会执行我们的指令。这种单模态的工作模式就像钢铁侠的MarkI,虽然对于现有的任务,智能语音助手已经做得很好,但随着技术的不断创新,我们期待它能有更多的创新。将AI技术赋能到语音识别系统,可以让机器生成精美的图片,这就像给Alexa(亚马逊的智能语音助手)配备了激光炮和火箭靴。我们还可以使用它来实现更复杂的应用程序。不同于单模态智能语音助手Alexa和Siri,通过Jina,我们将打开多模态世界的大门。我们可以使用文本生成图像,使用语音生成视频,甚至可以使用任何一种模态信息来生成(或检索)另一种模态信息。同时,我们不需要像钢铁侠那样的天才,甚至不需要像浩克那样的智慧,也能在90行代码中创造奇迹。我们可以使用云原生微服务框架完成跨模态转换任务,部署到Kubernetes上。前期研究在过去的几年里,人工智能技术呈爆炸式增长,我们的研究已经从单一模态模型(例如,文本的Transformers,图像的BigImageTransfer)迅速转向可以同时处理不同模态数据的模型。多模态模型。不幸的是,尽管我们的模型已经转向多模态,但这仍然过时了。就在今年,我们看到从文本生成图像的工具有了显着的增长,例如DiscoArt、DALL-E2和StableDiffusion。还有其他模型甚至可以完成从文本生成视频和从图像生成3D模型的任务。StableDiffusion可用于生成图像(我们已经用它生成了以下图像):美国队长骑摩托车的照片!一张钢铁侠和卢克天行者跳舞的照片!用鲜艳的色彩在纽约画蜘蛛侠,Artstation趋势4K飞越天空的数字插图。现在火的不仅仅是多模态文本图像生成,就在几周前,OpenAI发布了自动语音识别系统Whisper。Whisper几乎可以在人类水平上处理口音、背景噪音和技术术语。本文结合了Whisper和StableDiffusion,可以直接完成语音生成图像的任务。用户可以通过语音输入一个简短的句子,Whisper会自动将语音转换为文本,然后StableDiffusion会根据文本生成图像。现有解决方案Speech-to-imagegeneration并不是一个新概念,很多学者都写过相关论文:S2IGAN:Speech-to-ImageGenerationviaAdversarialLearningDirectSpeech-to-ImageTranslationUsingAItoGenerateArt-AVoice-EnabledArt使用AssemblyAI构建的生成工具-实时语音到图像生成与上述解决方案不同,我们的示例基于最先进的模型并且完全可扩展。我们的应用程序是使用微服务架构构建的,可以轻松部署到Kubernetes。更重要的是,与上述解决方案相比,我们需要的代码量更小。关键挑战当思考最新的多模态模型可以构建什么时,您的想象力可能会天马行空,但实际构建与想象不同,存在几个关键问题:依赖地狱,构建单芯片集成系统相对简单,但是如果将最先进的深度学习模型结合在一起会导致依赖冲突。因为这些模型都是为了炫技而打造的,而忽略了兼容性。就像钢铁侠的火箭靴与激光炮不兼容一样,当他在空中击中奇塔瑞时,火箭靴消失,他像石头一样从天而降。而我们将突破兼容技术,拯救钢铁侠的生命!选择数据格式。如果要处理多模态信息,只选择一种数据类型来实现不同模态数据之间的互操作是非常麻烦的。当我们只需要处理单模态信息时,文本可以使用字符串,图像可以使用Tensor。但是在我们的例子中,语音和图像需要同时处理,如何针对不同的数据类型提供一站式的解决方案是一个棘手的问题。打包所有模型,最大的挑战仍然是混合不同的模型并构建一个完全成熟的应用程序。当然,你也可以将模型打包成容器,部署到云端并提供API。但是一旦您想将这两个模型结合在一起以创建稍微复杂的应用程序,就会出现混淆。尤其是当你想构建一个基于微服务架构的应用时,比如重用部分Pipeline(管道)来避免宕机,不同模型之间如何通信?更不用说部署在像Kubernetes这样的云原生平台上,或者监控和观察你的Pipeline。Jina的解决方案是目前最先进的多模态AIMLOps平台,Jina生态帮助开发者和企业解决跨模态生成任务(如:语音-图像生成)面临的挑战。为了以干净、可扩展和可部署的方式集成Whisper和StableDiffusion,我们将:使用Jina将深度学习模型打包到Executors中。结合Executors得到JinaFlow(一个可重用的、碎片化的云原生AI应用程序)。使用DocArray向Flow发送数据,使用JinaHub上的Executor顺序处理数据。将应用程序部署到Kubernetes/JCloud并实现可观察性。管道和构建块不仅仅是概念。Flow是一个云原生应用,每个Executor都是一个微服务。Jina通过将每个执行器视为微服务,将构建块的组合(由模块和类分隔)转换为云原生组合。这些微服务可以无缝重用和分片。Flow和Executors均由最先进的网络工具提供支持,并依赖于双流网络。这样就解决了上面提到的3个问题:DependencyHell->每个model封装成一个独立的微服务Executor,所以不会互相干扰。选择DataFormat->DocArray可以处理我们输入的任何数据,无论是语音、文本、图像还是其他数据格式。打包所有模型->Jina将模型封装成一个微服务Executor后,JinaFlow协调所有微服务并提供接口给用户。基于Jina的云原生能力,我们也可以很方便的将应用部署到Kubernetes或者JCloud上,并对应用进行观察和监控。构建执行器多模式检索或生成任务需要一些步骤来构建执行器,具体取决于您的任务。在我们的语音转图像任务中,步骤如下:用户的语音被输入到界面中。使用Whisper将语音转换为文本。将输出文本输入StableDiffusion以生成图像。在界面中显示图像。由于我们更关注后端算法,所以我们将重点放在步骤2和步骤3上,将每个模型封装成一个Executor:WhisperExecutor——将用户的语音转换成文本。StableDiffusionExecutor-从文本生成图像。在Jina中,Executors是可以执行单个任务的微服务。所有Executor都使用Documents作为基本数据类型。有关详细信息,请参阅“流数据”部分。通过编写Executor(模块/类分离),每个Executor都可以无缝分片、复用、部署在Kubernetes上,而且都是可观察的。WhisperExecutor代码如下代码片段所示,其中每个函数都有自己的@requests装饰器,用户可以通过调用函数指定网络端口。由于我们没有指定端口,因此无论何时访问任何端口,都会调用transcript()。类WhisperExecutor(Executor):def__init__(self,args,kwargs):super().__init__(args,kwargs)self.model=whisper.load_model('base')Do@requestsArdefcument*transcribe,doc(se:*kwargs):for(i,doc_)inenumerate(docs):Model_output=Self.model.transcrip(doc_.uriifdoc_.Tensorisnoneelsedoc_.TEXT=model_outputtags['segments']=model_output['segments']doc_.tags['language']=model_output['language']returndocsbuildFlowFlow是一个组合Executors得到的Pipeline,可用于多/跨模态模型,Documents会进入Pipeline并被Executors处理.Flow相当于配置和启动微服务架构的接口,剩下的工作由Executors完成,每个Flow都会登录Gateway(网关)服务,因此可以通过自定义API连接到其他服务。Gateway将所有的Executor连接在一起,保证每个请求根据Flow的top经过不同的Executorology(例如,它在ExecutorB之前进入ExecutorA)。Flow用于语音和图像生成应用的拓扑结构比较简单,只有两个Executor,WhisperExecutor和StableDiffusionExecutor。以下代码定义了Flow并提供了端口供用户连接和传输数据。流可以用flow.plot()可视化。FlowTopology所有流进流出Flow的内容都必须是一个Document,它是DocArray包中的一个类。DocArray为多模态数据(在我们的例子中是语音、文本和图像)提供了一个通用的API,它可以将不同模态的数据统一到同一个数据结构中。这意味着无论使用何种模态,Document都可以存储数据。并且因为所有Executor使用的数据类型都是Documents和DocumentArrays,所以可以保证一致性。在我们的语音到图像生成任务中,输入文档是用户语音的样本。Document将采样的语音数据存储为Tensor。如果我们把输入的Document看成doc:首先会通过前端页面创建doc,然后将用户输入的声音存储为doc.tensor。Doc可以通过调用gRPC接口从前端发送给WhisperExecutor。WhisperExecutor会将接收到的张量转换为doc.text。之后,doc将被发送到StableDiffusionExecutor。StableDiffusionExecutor会读取doc.text,根据文本内容生成两张图片,图片保存在doc.matches中。接下来,前端会收到来自Flow的文档。最后,前端会得到输出的Document,并将生成的图片显示在界面上。4.连接Flow用户可以通过Flow连接Jina客户端和第三方客户端,在我们的例子中,Flow开启了gRPC端口。只需一行代码,您就可以轻松地将gRPC端口替换为RESTful、WebSockets或GraphQL端口。此外,网关部署在Deployments中,用于向Executors发送请求。更何况,这些转换都是吉娜实时完成的。部署FlowJina作为云原生框架,与Kubernetes的结合最为耀眼。[1]文档“DeployingwithKubernetes”解释了如何在Kubernetes上部署Flow,让我们一起揭开序幕,深入了解底层原理。如前所述,Executor是一个容器化的微服务。我们应用中的两个Executor作为一个Deployment独立部署在Kubernetes系统中。此外,Gateway部署在Deployment中,以便请求通过Executor。这意味着Kubernetes可以处理它们的生命周期、机器调度等,更重要的是,你只需要在Python中定义Flow,Jina会实时帮你完成部署。当然你也可以把Flow部署在JCloud上,JCloud也可以完成以上内容,而且还提供了方便的监控dashboard。你只需要将PythonFlow转成YAMLFlow(包括JCloud的一些具体参数),然后就可以部署了:jcdeployflow.yaml最后的效果现在是见证奇迹的时刻!输入一些测试查询:启用监控后(默认情况下启用),Flow内部发生的所有事情都可以在Grafana仪表板中可视化。监控的好处在于它可以帮助您优化您的应用程序,并通过检测性能瓶颈使您的应用程序更具成本效益。例如,下面的监控结果表明,在我们的应用中,StableDiffusionExecutor存在性能瓶颈:这意味着负载过重会导致延迟飙升。为了提高运行效率,我们可以复用StableDiffusionExecutor,将图像生成任务分散到不同的机器上。f=(Flow(port=54322).add(uses=WhisperExecutor).add(uses=StableDiffusionExecutor,uses_with={'auth_token':hf_token},replicas=2))或者您可以修改JCloudYAML文件:-名称:扩散用途:jinahub+docker://stablediffusionExecutoruse_with:auth_token:your_tokentimeout_ready:-1#慢下载速度通常会导致超时复制速度:2jcloud:2jcloud:resources:gpu:gpu:1moreme:1moreme:16结论结论结论文我们的JinaAIMLOps平台构建了一个云原生的语音转图像生成应用程序。我们通过使用DocArray弥合不同数据类型之间的差距来降低应用程序的数据传输成本。同时,使用Jina构建原生的基于微服务的Pipeline,可以方便的部署到Kubernetes系统中。由于Jina是模块化架构,因此很容易将类似的解决方案应用于不同的用例,例如构建多模式PDF搜索引擎,用户可以在其中使用文本或图像搜索匹配的PDF。构建一个多模式时尚搜索引擎,用户可以在其中搜索基于文本或图像的项目。用于电影布景设计的3D生成模型。基于GPT-3的博客生成模型。这些应用程序是云原生的、可扩展的,并且非常容易部署到Kubernetes集群。参考链接[1]多式联运世界:https://jina.ai/news/paradigm...[2]DiscoArt:https://colab.research.google...[3]耳语:https://openai.com/blog/whisp...[4]请求装饰器:https://docs.jina.ai/fundamen...[5]网关:https://docs.jina.ai/fundamen...[6]流拓扑:https://docs.jina.ai/fundamen...[7]可视化:https://docs.jina.ai/fundamen...[8]Jina客户端:https://docs.jina.ai/fundamen...[9]第三方客户端:https://docs.jina.ai/fundamen...[10]使用Kubernetes部署文档:https://docs.jina。ai/操作方法/k...
