在之前数字人模型优化,并且封装成模块之后,再进一步集成输入输出,前端输入大模型回答内容,也就是sentence参数,以及前端输入的role,对应需要的角色
1. 模型优化与模块封装
首先,我对数字人模型进行了优化,并将其封装成一个独立模块。这一模块能够处理从输入文本到输出视频的整个流程。为了实现这一目标,我进一步集成了输入输出功能
2. 输入参数与角色选择
在前端,用户可以输入他们想要大模型回答的内容,即 sentence
参数,同时选择需要的角色,这一参数用 role
表示。不同的角色对应不同的文本到语音转换(TTS)声音和图像,因此我们可以将这些步骤串联起来:
sentence & role => TTS => sadTalker => video
3. Flask 路由实现
通过一个 Flask 应用,将前端输入的文本和角色信息转化为动态视频,
以下是我们如何通过 Flask 路由来实现文本到视频的转换:
@app.route('/texttovideo')
def texttovideo():
data = request.args
sentence = data.get('sentence', 'Hello, I am SpeakSpark! Nice to meet you!')
role = data.get('role','girl')
voicename = 'en-US-AvaMultilingualNeural' if role == 'girl' else 'en-US-BrianMultilingualNeural'
tts(voicename=voicename, path_to_save='./files/audio.wav', text=sentence)
video = talker.test(
pic_path=pic_path.format(role=role),
crop_pic_path=crop_pic_path.format(role=role),
first_coeff_path=first_coeff_path.format(role=role),
crop_info=crop_info,
driven_audio=audio,
preprocess=preprocess_type,
still_mode=is_still_mode,
use_enhancer=enhancer,
batch_size=batch_size,
size=size_of_image,
pose_style = pose_style,
facerender=facerender,
exp_scale=exp_weight,
use_idle_mode = use_idle_mode,
length_of_audio = length_of_audio,
use_blink=blink_every,
fps=20
)
print(sentence)
return send_from_directory(directory='./files', path=f'{role}_audio.mp4')
4. 详细实现过程
-
获取前端输入:通过
request.args
获取前端传递的sentence
和role
参数。如果没有传递,则使用默认值。 -
选择 TTS 声音:根据角色选择不同的 TTS 声音。这里我们使用微软 Azure 提供的 TTS 服务,其中女孩角色使用
en-US-AvaMultilingualNeural
,男孩角色使用en-US-BrianMultilingualNeural
。 -
生成音频文件:调用 TTS 服务,将文本转换为语音,并保存为
audio.wav
文件。 -
生成视频:调用
sadTalker
模块,将生成的音频与对应角色的图像结合,生成最终的视频。 -
返回视频文件:将生成的视频文件通过 Flask 的
send_from_directory
返回给前端。
具体配置如下:
blink_every = True
size_of_image = 256
preprocess_type = 'crop'
facerender = 'facevid2vid'
enhancer = False
is_still_mode = False
pic_path = './inputs/{role}.png'
crop_pic_path = './inputs/first_frame_dir_{role}/{role}.png'
first_coeff_path = './inputs/first_frame_dir_{role}/{role}.mat'
crop_info = ((403, 403), (19, 30, 502, 513), [40.05956541381802, 40.17324339233366, 443.7892505041507, 443.9029284826663])
exp_weight = 1
batch_size = 10
pose_style = random.randint(0, 45)
use_ref_video = False
ref_video = None
ref_info = 'pose'
use_idle_mode = False
length_of_audio = 5
audio = './files/audio.wav'
talker = SadTalker()
通过以上步骤,我实现了从文本到视频的转换功能。用户可以在前端输入文本并选择角色,系统将自动生成对应的角色视频