【AI视频】复刻抖音爆款AI数字人作品初体验

news2024/9/20 20:51:11

在这里插入图片描述

博客主页: [小ᶻZ࿆]
本文专栏: AI视频 | AI数字人

文章目录

  • 💯前言
  • 💯抖音上的爆火AI数字人视频
  • 💯注册HeyGen账号
  • 💯复刻抖音爆款AI数字人
  • 💯最终生成效果
  • 💯小结


对比原视频效果

左为原视频,右为本文生成

本文生成输入视频的完整效果:(注意:背景音乐是后期加上去的)

本文数字人视频完整生成结果


在这里插入图片描述


💯前言

  • 随着人工智能技术的迅速发展,数字人不再是科幻电影中的虚构产物,而是逐渐走进了我们的日常生活。曾经只有大型企业和专业团队才能运用的这项技术,如今已经触手可及,大众也可以轻松使用。无论是内容创作者、企业宣传,还是个人娱乐,数字人都提供了一种全新的表达方式,让每个人都能够通过人工智能的力量,打造出独具特色的作品。
    HeyGen在这里插入图片描述

💯抖音上的爆火AI数字人视频

  • 数字人在抖音上是一种非常新颖且有吸引力的表现形式。由于其独特的视觉效果和流畅的交互体验,AI数字人迅速成为了短视频平台上的热门趋势。不论是用于知识分享、品牌宣传,还是娱乐内容,这种技术都为创作者带来了前所未有的可能性。它不仅突破了传统真人视频的限制,还能够以高效、低成本的方式实现个性化的内容表达,吸引了大量用户的关注和互动。
    在这里插入图片描述

  • 本文将以这个点赞量12.6w的爆款数字人视频为例,手把手教你如何从零开始,初步体验AI数字人技术的入门步骤。这篇文章适合新手,内容简单易懂,不需要你具备太多技术背景。本文将带你了解如何选择基础的AI工具、简单地调整内容呈现方式,并进行基本的后期处理。通过这篇入门级教程,你将轻松掌握AI数字人制作的基础概念,开启你的数字创作之旅!
    在这里插入图片描述


💯注册HeyGen账号

  1. 进入HeyGen官网点击Get started。
    在这里插入图片描述

  2. 点击注册,如果有Google邮箱的话可以直接用Google在这里插入图片描述

  3. 填写邮箱
    在这里插入图片描述

  4. 登录邮箱拿到验证码填入
    在这里插入图片描述

  5. 设置密码,长度必须为 8 到 35 个字符,包括大写、小写字母、数字和特殊字符。
    在这里插入图片描述

  6. 注册成功后会跳转到HeyGen主界面,注意:一个账号一个月可以免费生成三次视频。
    在这里插入图片描述


💯复刻抖音爆款AI数字人

  1. 在HeyGen主界面中,您可以轻松地开始您的视频制作。进入界面后,点击左侧菜单中的“Create video”按钮,即“创建视频”,如图所示。
    在这里插入图片描述

  2. 在选择视频布局时,您可以根据需求选择横屏或竖屏模式。为了更好地展示数字人,我们建议选择竖屏模式。在创建视频的界面中,点击“Use portrait”按钮,即“使用肖像”选项
    在这里插入图片描述

  3. 在这一步骤中,您需要选择一个合适的头像来作为视频中的数字人。进入头像选择界面后,点击“Studio Avatar”(工作室头像)选项
    在这里插入图片描述

  4. 在选择头像的界面中,往下滚动页面,找到与爆款视频相同的数字人形象,如图中红框所示。在这里插入图片描述

Looking for a wife? Must find a woman with a big temper. No temper is like a glass of water. Quench thirst, but tasteless. A woman with a temper is not the same. Her bark is worse than her bite. She is particularly kind. She worries about her family at home and her temper comes quickly and goes quickly. She's like a strong drink you can't forget. If you do, cherish it. Do you understand?
  1. 在这一步中,需要为您的数字人输入与目标视频相同的文案内容。点击左侧菜单中的“Script 脚本”选项,在文本框中输入视频中使用的文案内容,如上所示。
    在这里插入图片描述

  2. 在这一步中,为了让数字人能够更好地传达视频内容,您可以选择合适的语音选项。点击“Script 脚本”界面中的语音选择区域,如图所示,可以从多个语音选项中进行挑选。不同的语音有着不同的语调、情感和节奏,选择一个与视频内容最契合的语音类型,可以让数字人的表现更加自然和有吸引力。
    在这里插入图片描述

  • 这里推荐用ctrl+G搜索Molly-Newscaster更方便快捷
    在这里插入图片描述
  1. 在调整语音设置时,您可以根据需要修改数字人的语速,使其更符合视频的整体节奏和氛围。在“Script 脚本”界面中,点击语音设置旁边的选项按钮,进入“Voice settings 语音设置”菜单,如图所示。
  • 差不多是设置1.5倍速
    在这里插入图片描述
  1. text模块可在视频里面加文本和标识。
    在这里插入图片描述

  2. 为了确保数字人的画面与语音完美同步,您需要将时间轴上的数字人画面时长调整为与说话时间一致。
    在这里插入图片描述

  3. 在完成所有设置并确认无误后,最后一步就是提交生成您的AI数字人视频。在编辑页面的右上角,点击“Submit 提交”按钮,如图所示。系统将开始处理您所设定的脚本、语音和画面,生成最终的视频。
    在这里插入图片描述
    在这里插入图片描述

  4. 在视频生成完成后,您可以在HeyGen平台的主界面中看到所有已生成的视频,下载到本地。在这里插入图片描述


💯最终生成效果

本文生成的数字人视频最终效果:(注意:背景音乐是后期加上去的)

本文数字人视频完整生成结果


💯小结

  • 在这里插入图片描述
    虽然这篇文章仅是入门级别的教程,但它展示了数字人技术的无限潜力。我们可以看到,抖音上的爆款数字人视频不仅仅是娱乐内容的呈现,更是新媒体创作的一个缩影。这些技术使得创作者能够以更具创意和个性化的方式表达自我,同时也大大降低了制作门槛。

  • 在创作过程中,我们意识到,无论是内容创作者还是企业推广,掌握AI数字人技术都是一个值得尝试的方向。它不仅能够提升内容的吸引力,还能为用户带来独特的体验。我希望这篇文章能为那些和我一样对数字人技术感兴趣的朋友提供帮助,让大家在数字创作的世界中找到属于自己的风格。

  • 继续探索、不断尝试,我们都可以成为数字时代的创作者!希望你在阅读后也能感受到AI数字人带来的乐趣和可能性,期待看到更多精彩的数字人作品!


import tensorflow as tf
from tensorflow.keras import layers
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(42)
tf.random.set_seed(42)

latent_dim = 100
image_size = 64
batch_size = 64
epochs = 10000

def build_generator():
    model = tf.keras.Sequential()

    model.add(layers.Dense(8 * 8 * 256, use_bias=False, input_shape=(latent_dim,)))
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())

    model.add(layers.Reshape((8, 8, 256)))

    model.add(layers.Conv2DTranspose(128, (5, 5), strides=(2, 2), padding='same', use_bias=False))
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())

    model.add(layers.Conv2DTranspose(64, (5, 5), strides=(2, 2), padding='same', use_bias=False))
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())

    model.add(layers.Conv2DTranspose(3, (5, 5), strides=(2, 2), padding='same', use_bias=False, activation='tanh'))

    return model

def build_discriminator():
    model = tf.keras.Sequential()

    model.add(layers.Conv2D(64, (5, 5), strides=(2, 2), padding='same', input_shape=[image_size, image_size, 3]))
    model.add(layers.LeakyReLU())
    model.add(layers.Dropout(0.3))

    model.add(layers.Conv2D(128, (5, 5), strides=(2, 2), padding='same'))
    model.add(layers.LeakyReLU())
    model.add(layers.Dropout(0.3))

    model.add(layers.Conv2D(256, (5, 5), strides=(2, 2), padding='same'))
    model.add(layers.LeakyReLU())
    model.add(layers.Dropout(0.3))

    model.add(layers.Flatten())
    model.add(layers.Dense(1))

    return model

def discriminator_loss(real_output, fake_output):
    real_loss = tf.keras.losses.BinaryCrossentropy(from_logits=True)(tf.ones_like(real_output), real_output)
    fake_loss = tf.keras.losses.BinaryCrossentropy(from_logits=True)(tf.zeros_like(fake_output), fake_output)
    return real_loss + fake_loss

def generator_loss(fake_output):
    return tf.keras.losses.BinaryCrossentropy(from_logits=True)(tf.ones_like(fake_output), fake_output)

generator_optimizer = tf.keras.optimizers.Adam(1e-4)
discriminator_optimizer = tf.keras.optimizers.Adam(1e-4)

generator = build_generator()
discriminator = build_discriminator()

@tf.function
def train_step(images, generator, discriminator, batch_size, latent_dim):
    noise = tf.random.normal([batch_size, latent_dim])

    with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape:
        generated_images = generator(noise, training=True)

        real_output = discriminator(images, training=True)
        fake_output = discriminator(generated_images, training=True)

        gen_loss = generator_loss(fake_output)
        disc_loss = discriminator_loss(real_output, fake_output)

    gradients_of_generator = gen_tape.gradient(gen_loss, generator.trainable_variables)
    gradients_of_discriminator = disc_tape.gradient(disc_loss, discriminator.trainable_variables)

    generator_optimizer.apply_gradients(zip(gradients_of_generator, generator.trainable_variables))
    discriminator_optimizer.apply_gradients(zip(gradients_of_discriminator, discriminator.trainable_variables))

    return gen_loss, disc_loss

(train_images, train_labels), (_, _) = tf.keras.datasets.cifar10.load_data()

train_images = train_images.reshape(train_images.shape[0], image_size, image_size, 3).astype('float32')
train_images = (train_images - 127.5) / 127.5

train_dataset = tf.data.Dataset.from_tensor_slices(train_images).shuffle(60000).batch(batch_size)

def train(generator, discriminator, dataset, epochs, latent_dim, batch_size):
    for epoch in range(epochs):
        for image_batch in dataset:
            gen_loss, disc_loss = train_step(image_batch, generator, discriminator, batch_size, latent_dim)

        if epoch % 100 == 0:
            print(f"Epoch {epoch}, Gen Loss: {gen_loss}, Disc Loss: {disc_loss}")
            generate_and_save_images(generator, epoch, latent_dim)

def generate_and_save_images(model, epoch, latent_dim):
    noise = tf.random.normal([16, latent_dim])
    generated_images = model(noise, training=False)

    fig = plt.figure(figsize=(4, 4))

    for i in range(generated_images.shape[0]):
        plt.subplot(4, 4, i + 1)
        plt.imshow((generated_images[i] * 127.5 + 127.5).astype(np.uint8))
        plt.axis('off')

    plt.savefig(f'generated_images_epoch_{epoch}.png')
    plt.show()

train(generator, discriminator, train_dataset, epochs, latent_dim, batch_size)

在这里插入图片描述


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

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

相关文章

JVM面试真题总结(十一)

文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 解释双亲委派模型及其优势 双亲委派模型是Java类加载器的一个重要…

Qt:静态局部变量实现单例(附带单例使用和内存管理)

前言 本文主要写静态局部变量实现的单例以及单例的释放,网上很多教程只有单例的创建,但是并没有告诉我们单例的内存管理,这就很头疼。静态局部变量实现的单例应该是最简单的单例,而且不需要内存管理。 正文 静态局部变量单例&a…

微服务实战系列之玩转Docker(十五)

前言 博主的玩转Docker系列,今天正式开启第十五篇的征程! 在过去的十四篇中,涉及的内容有知识、有原理、有工具、更有实践。当你打开每一篇文章时,均会获得一个特定主题的知识和技巧,助你在云原生的世界里&#xff0c…

C++实现unordered_map和unordered_set

1. 结构示意 2. 模版参数控制 我们知道,unordered_set和unordered_map与set和map是一样的,前者不是真正的键值对,它的value值和key值相同;后者是真正的键值对。STL非常注重代码的复用,它们在底层使用了同一棵红黑树模…

floodfill算法(一)

目录 一、图像渲染 1. 题目链接:733. 图像渲染 2. 题目描述: 3. 解法 🌴算法思路: 🌴算法代码: 二、岛屿数量 1. 题目链接:200. 岛屿数量 2. 题目描述: 3. 解法 &#x1f…

FinLex An effective use of word embeddings for financial lexicon generation

FinLex: An effective use of word embeddings for financial lexicon generation 论文阅读 文章目录 FinLex: An effective use of word embeddings for financial lexicon generation 论文阅读 AbstractMethodology具体词表例子LM 词列表与 FinLex 词列表 词列表在分类任务中…

网络安全学习(二)Netdiscover

Netdiscover是一款网络扫描工具(kali中有这个工具),它可以扫描本地网络主机,它借助ARP协议实施主机发现,长这个样子。 点击打开,进入命令行。 首先查看本机的IP地址,命令为ifconfig&#xff0c…

TAG:BladeLLM 的纯异步推理架构

作者:张子鹏 PAI引擎团队 随着 GQA/MLA/MoE 等模型结构不断发展,大语言模型的推理逐步解除了显存限制,逐渐向着高并发、高吞吐的方向发展。推理引擎的运行时开销也变得不可忽视。主流 LLM 推理框架的运行时开销大致来自: Python …

【MySQL学习】基础指令全解:构建你的数据库技能

📃个人主页:island1314 🔥个人专栏:MySQL学习 ⛺️ 欢迎关注:👍点赞 👂🏽留言 😍收藏 💞 💞 💞 引言 下面的操作都是在windows 的…

AT89C51 Intel HEX手工结构分析 反汇编工具

在不查询格式情况下分析确定 Intel HEX 格式 Hex文件内容 :0300000002090BE7 :0C090B00787FE4F6D8FD7581080208F63C :01091700419E :1008F60078087C007D007BFF7A0979177E007F01EE :050906001208D080FE84 :10080000E709F608DFFA8046E709F208DFFA803EDA :1008100088828C83E709F0…

C++基础面试题 | C++中的构造函数可以是虚函数吗? C++中的析构函数一定要是虚函数吗?

文章目录 问题一:在C中,构造函数不能是虚函数。问题二:析构函数不一定需要声明为虚函数,但在多态环境下,建议一定将其声明为虚函数。示例虚函数总结 问题一:在C中,构造函数不能是虚函数。 这是…

PMP--一模--解题--81-90

文章目录 4.整合管理81、 [单选] 一位先前不活跃的干系人参与程度突然增加,这种意外的参与导致了一些变更请求。项目经理应该做什么? 4.整合管理82、 [单选] 公司的新产品系列将在两个月内发布,95%的项目任务均已完成。但是,管理层…

二分算法——优选算法

个人主页:敲上瘾-CSDN博客 个人专栏:游戏、数据结构、c语言基础、c学习、算法 本章我们来学习的是二分查找算法,二分算法的应用非常广泛,不仅限于数组查找,还可以用于解决各种搜索问题、查找极值问题等。在数据结构和算…

无人机飞手培训机构组建及市场分析

飞手培训机构是专门为培养无人机飞行员(飞手)而设立的教育机构。这些机构通过提供专业的培训课程,帮助学员掌握无人机飞行技术、了解相关法规、提升实战能力,并最终获得相关证书,以便在航拍摄影、农业植保、物流配送、…

MS SQL Server 实战 排查多列之间的值是否重复

目录 需求 范例运行环境 数据样本设计 功能实现 上传EXCEL文件到数据库 SQL语句 小结 需求 在日常的应用中,排查列重复记录是经常遇到的一个问题,但某些需求下,需要我们排查一组列之间是否有重复值的情况。比如我们有一组题库数据&…

django实现开发、测试、生产环境配置区分

文章目录 一、为什么要区分开发 (dev)、测试 (test) 和生产 (prod) 环境二、django项目如何通过配置实现环境配置的区分1、针对不同的环境创建不同的设置文件settings.py2、在设置文件中根据需要进行配置区分3、根据不同的环境运行使用不同的设置文件 任何实际的软件项目中都要…

使用Python打造全自动wx好友添加器:批量操作,高效省时的社交神器

在现代的数字营销和社交扩展中,自动化操作可以显著提高效率。尤其是wx这种广泛使用的即时通讯工具,很多用户有批量添加好友的需求,但手动操作费时费力。本教程将详细介绍如何使用 Python 开发一个自动化工具,帮助你批量添加wx好友…

宏任务和微任务+超全面试真题(持续更新ing

概念 微任务和宏任务是在异步编程中经常使用的概念,用于管理任务的执行顺序和优先级。 宏任务:setTimeout, setInterval,I/O 操作和 UI 渲染等。微任务: Promise 回调、async/await等 微任务通常比宏任务具有更高的优先级。 执…

C#基础(11)函数重载

前言 前面我们已经完成了ref和out补充知识点的学习,以及函数参数相关的学习,今天便再次为函数补充一个知识点:函数重载。 函数重载是指在同一个作用域中,可以有多个同名函数,但参数列表不同。它的发展可以追溯到早期…

【Chrome】开发一个Chrome扩展以及常见问题的解决方案

前言 本文介绍开发chrome扩展很重要的几种操作,如:操作网页dom、发送请求、渲染弹层、不同沙盒环境的通信方式、扩展与网页的通信方式、遇到iframe时的操作等。最终会提供一个简单的案例,其中涵盖了上述操作。 还有一些本人相关文章&#x…