给数字人生成加上界面,基于ER-NeRF/RAD-NeRF/AD-NeRF,Gradio框架构建WEBUI,使用HLS流媒体,实现边推理边播放——之三:在WEBUI中播放m3u8视频,边推边存边播放

这篇具有很好参考价值的文章主要介绍了给数字人生成加上界面,基于ER-NeRF/RAD-NeRF/AD-NeRF,Gradio框架构建WEBUI,使用HLS流媒体,实现边推理边播放——之三:在WEBUI中播放m3u8视频,边推边存边播放。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

  • 前面两篇文章讲了Gradio输出日志和ER-NeRF推理的图转存为ts文件
  • 这篇就讲讲如何在Gradio中实时的播放服务器生成的m3u8文件
  • 要让web上能播放,那首先要有个播放器,支持hls协议的web播放器,有video.js和hls.js等等,原生的video也能播,我这里选用hls.js
  • 除了播放器,还得要让web前端上能寻找到m3u8文件,也就是要让gradio能够支持直接通过url加载到m3u8文件,这涉及到gradio的静态文件挂载
  • 我们还需要让gradio能够把播放器在我们设计的webui上展示出来,而gradio的组件库里面是没有可用加载hls.js脚本的播放器组件的,这里就涉及到我们需要自定义组件

效果

  • 没有加载播放器时界面:
    er-nerf 开源,数字人,数字人webui,gradio构建webui,实时推理实时播放,hls实时播放
  • 加载了播放器之后的组件:
    er-nerf 开源,数字人,数字人webui,gradio构建webui,实时推理实时播放,hls实时播放

实现

首先,我们需要让gradio能够通过url加载到我们的m3u8静态文件。
为了实现这个目标,我们需要引入FastAPI,使用FastAPI挂载一个静态目录,然后在gradio中挂载FastAPI。

#设置静态目录
app = FastAPI()
dir = os.path.abspath(os.getcwd()) #将当前根目录作为静态目录
app.mount('/static', StaticFiles(directory=dir), 'static')

将gradio和FastAPI挂载在一起(当前gradio本身是需要支持queue的),参考:https://www.gradio.app/docs/mount_gradio_app

#将fastapi的静态目录和gradio挂载一起
page = page.queue()
app = gr.mount_gradio_app(app, page,path='/')

如此操作之后,就不能再使用gradio的.launch()方法来启动应用了
launch()启动之后没有FastAPI效果,挂载也就白挂了

这里使用Uvicorn来启动,关于Uvicorn,参考网上资料

uvicorn main-webui:app --port 7861 #端口好不指定默认为8000

启动之后,我们就可以通过http://127.0.0.1/static/xx/xx/xx.m3u8访问到视频索引文件了。

接下来就自定义一个gradio的video组件,让他把视频播放出来。
由于视频的m3u8文件的url是动态生成的,客户端只能监听服务器的日志消息,当出现某种特殊消息的时候,客户端就认为出现了m3u8的地址了,就解析那条消息,获取到视频索引文件url,然后构建video组件进行播放:
所以,首先改造我们之前的log_out函数,让他解析特定消息中的m3u8地址,然后向web上输出一条video的html代码字符串,我们的前端日志解析代码读取到这段html代码后,就会在界面上特定的位置,将这段代码渲染出来:

video_div = '<div id="videoDiv" style="width:100%;height:512px;"><video style="width:100%;height:100%;" id="videoDom" controls m3u8="[M3U8URL]"></video></div>'
def log_out(new_log):
    print(new_log)
    if new_log.find('##M3U8##SUCCESS:')>-1:
        #根据日志输出的信息处理,提取到m3u8的地址
        video = new_log.replace('##M3U8##SUCCESS:', '')
        video = video_div.replace('[M3U8URL]', video)
        time.sleep(0.7) #让客户端有时间来出来视频显示
        print('输出video:'+video)
        return video
    return new_log

然后改造webui上日志输出功能代码:
原来的代码见:给数字人生成加上界面,基于ER-NeRF/RAD-NeRF/AD-NeRF,Gradio框架构建WEBUI,使用HLS流媒体,实现边推理边播放——之一:在WEBUI中实时输出服务器控制台日志:https://blog.csdn.net/AJian759447583/article/details/133990434

_script = '''
   async()=>{
      .......
      //将hls.js的代码加入到页面上
      ......
       //监控日志输出及显示
       			let video= document.querySelector("#videoDivCom");
               let output = document.querySelector("#logDivText .border-none");
               if(!output){
                   return false;
               }
               let show = document.querySelector('#logShowDiv .container')
               show.style.height='200px'
               show.style.overflowY='scroll'
               show.innerHTML=""
               Object.defineProperty(output, "value", {
                   set:  function (log) {
                       if(log && log!=''){
                           	if(log.startsWith('<div id="videoDiv"')){
                                     video.innerHTML=log                  
                                }else{
                                    show.innerHTML = show.innerHTML+'<br>'+log
                                    show.scrollTop=show.scrollHeight
                                }
                       }      
                       return this.textContent = log;
                   }
               });
               ......
   }
'''
#在page页面加载的时候,将自定义的js加载进去
page.load(_js=_script)

如此,页面上就可以动态加载到视频,实现服务器GPU一边推理CPU一边转视频,webui客户端一边播放的效果。

那,如果再将这个过程的各个时间点加快,选用更好更快的服务器,然后再把实时TTS整合进来,一个实时根据文本生成指定声音并自动推理出指定音频的数字人视频就搞定了!

当然,这其中肯定有一亿点点细节需要处理…
包括我上面的三篇文章,也仅仅是对整体思路的一个大致讲解,具体实现上肯定还有一亿点点细节需要处理,前面两篇文章:文章来源地址https://www.toymoban.com/news/detail-778024.html

  • 给数字人生成加上界面,基于ER-NeRF/RAD-NeRF/AD-NeRF,Gradio框架构建WEBUI,使用HLS流媒体,实现边推理边播放——之一:在WEBUI中实时输出服务器控制台日志:https://blog.csdn.net/AJian759447583/article/details/133990434
  • 给数字人生成加上界面,基于ER-NeRF/RAD-NeRF/AD-NeRF,Gradio框架构建WEBUI,使用HLS流媒体,实现边推理边播放——之二:将ndarray内存序列图直接转成ts格式视频:https://blog.csdn.net/AJian759447583/article/details/133994863

总结

  • 整体思路很简单直白,技术上不存在鸿沟
  • 具体细节上有太多需要探究的内容,往往每一步都被某个技术小细节卡死,然后各种探究各种尝试,最后一定是经过了N多个小时的试验之后才能解决——当然也有可能还是解决不了
  • 本次运用到的陌生技术,以前没有接触过的、不熟悉的:
    1:服务器日志实时输出到web客户端(花了大量时间实验)
    2:python的gradio框架(按官网学习,很好上手)
    3:ffmpeg命令(很复杂,脑壳痛…)
    4:在python中使用ffmpeg的管道(很好理解,但是输入管道同时输出也是管道时,花了大量时间调研、尝试,最终也没解决)
    5:gradio的queue和fastapi及静态文件(找了一会儿方案,尝试了个把小时)
    6:hls流媒体协议(略读)
    7:m3u8文件格式(细读)
    8:ts格式媒体文件的封包协议细节(ffmpeg转成ts时,VLC播放器音画正常,hls.js在web上播放只有声音没有画面,解决此问题花了大量时间,尝试了各种参数,最终确定有效的为:vcodec=‘libx264’, r=25,output_ts_offset=ts_index * 5,hls_time=5,hls_segment_type=‘mpegts’)
  • 待继续优化的点:python中使用ffmpeg进行管道输入和管道输出。目前同时进行管道输入输出会出现程序挂起的现象,即使写入一帧数据读取一帧数据也是同样现象,暂时未解。

到了这里,关于给数字人生成加上界面,基于ER-NeRF/RAD-NeRF/AD-NeRF,Gradio框架构建WEBUI,使用HLS流媒体,实现边推理边播放——之三:在WEBUI中播放m3u8视频,边推边存边播放的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java代码实现自动生成数据库表er图

    最近有同事看到字节跳动产品设计文档里有数据库表er图。就想问问又没有现成的工具也给直接生成一个er图,经查找验证发现并没有。因为现在表关系都是用的逻辑外键而非物理外键约束的,所以像navicat等工具就算生成了也没有描述关系的连接线。那么为了满足需求,这边

    2024年02月19日
    浏览(31)
  • 利用代码生成工具快速生成基于SqlSugar框架的Winform界面项目

    我们接触一个新事物的时候,如果一个事物能够给我们带来非常直观的感官认识,那么我们就很容易接受,反之可能需要很长时间的潜移默化的了解认识才能接受。万物化繁为简,透过本质看表象,往往也是一个认知迭代深入的过程。在我介绍很多篇随笔《SqlSugar开发框架》

    2024年02月11日
    浏览(39)
  • 一个在线ER模型设计工具:支持数据库设计、生成、反向工程、优化和文档生成等操作

    ER模型,即实体关系模型,是数据库建模的一种重要方法。它可以帮助开发人员更好地理解数据库结构,并确定数据库的概念模型。在本文中,我们将详细介绍ER模型设计的基本概念和过程。 首先,我们需要了解ER模型中的两个基本概念:实体和关系。实体是数据库中存储的对

    2024年02月04日
    浏览(52)
  • 【3D生成与重建】SSDNeRF:单阶段Diffusion NeRF的三维生成和重建

    题目 :Single-Stage Diffusion NeRF: A Unified Approach to 3D Generation and Reconstruction 论文 :https://arxiv.org/pdf/2304.06714.pdf 任务 :无条件3D生成(如从噪音中,生成不同的车等)、单视图3D生成 机构 :Hansheng Chen,1,* Jiatao Gu,2 Anpei Chen, 同济、苹果、加利福尼亚大学 代码 :https://github.com/Lakon

    2024年02月02日
    浏览(35)
  • AI数字人:基于VITS模型的中文语音生成训练

            VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)是一种结合变分推理(variational inference)、标准化流(normalizing flows)和对抗训练的高表现力语音合成模型。         VITS模型是韩国科学院在2021年6月提出的,VITS通过隐变量而非频谱串联起来语

    2024年02月11日
    浏览(32)
  • IDEA生成ER图、UML类图、时序图、流程图等的插件推荐或独立工具推荐

    以下是几个常用的IDEA插件和独立工具,可以用于生成ER图、UML类图、时序图、流程图等: Visual Paradigm (独立工具) Visual Paradigm是一个强大的建模工具,可以生成UML类图、时序图、流程图等。它支持多种语言和框架,包括Java、Spring等。可以将生成的图形导出为多种格式,例如图

    2024年02月04日
    浏览(41)
  • 开源CA搭建-基于openssl实现数字证书的生成与分发

    目录 一、前言 二、openssl介绍 三、openssl的常用用法 (一)单向加密 (二)生成随机数 (三)生成公钥,私钥 1.生成私钥 2.提取公钥 四、搭建CA (一)创建根CA私钥: (二)生成自签名证书 (三)创建数据库以及新颁发证书数字 (四)设置证书的起始编号 (五)创建文件

    2024年02月06日
    浏览(32)
  • 从0开始快速使用StarUml画ER图,生成SQL建表代码,附解决DDL常见报错方法

    遇到稍微复杂一些的业务,先整理需求在下手会使得开发过程中头发少掉一些,尤其是团队合作的项目效果尤为明显,在整理完业务需求后, 从数据库开始下手能让后端的头发掉少一些. 找个好的软件能在整理数据库的时候再少掉点头发, 并且减轻简单重复的打字工作. 如果图画好

    2023年04月16日
    浏览(28)
  • 【三维生成】Make-it-3D:diffusion+NeRF从单张图像生成高保真三维物体(上交&微软)

    题目 : Make-It-3D: High-Fidelity 3D Creation from A Single Image with Diffusion Prior Paper : https://arxiv.org/pdf/2303.14184.pdf Code : https://make-it-3d.github.io/ 在本文中,研究者的目标是: 从一个真实或人工生成的单张图像中创建高保真度的3D内容 。这将为艺术表达和创意开辟新的途径,例如为像Stable

    2024年02月13日
    浏览(34)
  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(12) -- 使用代码生成工具Database2Sharp生成WPF界面代码

    在经过基于SqlSugar框架的WPF应用端系统界面及模块的不断优化和重构后,视图界面及视图模型等代码已趋稳定,因此完成前面的介绍后,现在开始统一基于代码生成工具Database2Sharp进行WPF应用端界面代码的快速生成了,代码除了和WPF应用端的基类保持一致处理外,并添加一些注

    2024年02月08日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包