Press "Enter" to skip to content

如何使用开源工具像专业人士一样克隆声音和视频口型同步

介绍

AI语音克隆风靡社交媒体。它开启了创造性的无限可能。你肯定在社交媒体上看过名人梗或AI语音配音。你想知道它是如何完成的吗?当然,许多平台提供像Eleven Labs这样的API,但我们能否免费使用开源软件来实现呢?答案是肯定的。开源界有TTS模型和嘴唇同步工具,用于实现语音合成。因此,在本文中,我们将探索用于语音克隆和嘴唇同步的开源工具和模型。

学习目标

  • 探索用于AI语音克隆和嘴唇同步的开源工具。
  • 使用FFmpeg和Whisper转录视频。
  • 使用Coqui-AI的xTTS模型进行语音克隆。
  • 使用Wav2Lip进行视频嘴唇同步。
  • 探索该技术的实际用例。

本文作为 数据科学博客马拉松 中的一部分发表。

开源栈

正如你已经了解的,我们将使用OpenAI的 Whisper,FFmpeg,Coqui-ai的xTTS模型和Wav2lip作为我们的技术栈。但在深入代码之前,让我们简要讨论一下这些工具。同时感谢这些项目的作者。

Whisper:Whisper是OpenAI的自动语音识别(ASR)模型。它是一个使用超过650k小时的各种音频数据和相应转录进行训练的编码器-解码器变压器模型。这使其在多语言转录方面非常强大。

编码器接收音频段的对数梅尔频谱图,每个编码器块使用自注意力机制来理解音频信号的不同部分。解码器然后接收编码器的隐藏状态信息和学习的位置编码。解码器使用自注意力机制和跨注意力机制预测下一个标记。最终,它输出代表识别文本的一系列标记。有关Whisper的更多信息,请参考官方存储库

Coqui TTS:TTS是Coqui-ai的开源库。它包含多个文本到语音模型。它具有端到端模型,如Bark、Tortoise和xTTS,频谱图模型如Glow-TTS、FastSpeech等,以及声码器如Hifi-GAN、MelGAN等。此外,它提供了一个统一的API用于推断、微调和训练文本到语音模型。在这个项目中,我们将使用xTTS,一个端到端的多语言语音克隆模型。它支持16种语言,包括英语、日语、印地语、普通话等。有关TTS的更多信息,请参考官方TTS存储库。

Wav2Lip:Wav2Lip是一个用于“A Lip Sync Expert Is All You Need for Speech to Lip Generation In the Wild”论文的Python存储库。它使用唇部同步鉴别器来识别脸部和嘴唇运动。这对于配音非常有用。有关更多信息,请参考官方存储库。我们将使用这个分叉的Wav2Lip存储库。

工作流程

现在我们对将要使用的工具和模型已经很熟悉了,让我们了解工作流程。这是一个简单的工作流程。下面是我们将要做的事情:

  • 将视频上传到Colab运行环境并将其调整为720p格式以获得更好的嘴唇同步效果。
  • 使用FFmpeg从视频中提取24位音频,并使用Whisper转录音频文件。
  • 使用Google Translate或LLM将转录脚本翻译为另一种语言。
  • 使用TTS库中的多语言xTTS模型加载脚本和参考音频模型进行语音合成。
  • 克隆Wav2lip存储库并下载模型检查点。运行inference.py文件将原始视频与合成音频同步。

现在,让我们深入了解这些代码。

步骤1:安装依赖

这个项目需要消耗大量的内存和GPU,所以最好使用Colab运行时。免费版的Colab提供12GB的CPU和15GB的T4 GPU。对于这个项目来说应该足够了。所以,去你的Colab上,连接到一个GPU运行时。

现在,安装TTS和Whisper。

!pip install TTS!pip install git+https://github.com/openai/whisper.git 

步骤2:将视频上传到Colab

现在,我们将上传一个视频并将其调整为720p格式。Wav2lip在视频为720p格式时性能更好。这可以使用FFmpeg来完成。

#@title 从google.colab导入文件from google.colab import filesimport osimport subprocessuploaded = Noneresize_to_720p = Falsedef upload_video():  global uploaded  global video_path  # 将video_path声明为全局以修改它  uploaded = files.upload()  for filename in uploaded.keys():    print(f'已上传 {filename}')    if resize_to_720p:        filename = resize_video(filename)  # 获取调整大小后视频的名称    video_path = filename  # 使用原始文件名或调整大小后的文件名更新video_path    return filenamedef resize_video(filename):    output_filename = f"resized_{filename}"    cmd = f"ffmpeg -i {filename} -vf 'scale=-1:720' {output_filename}"    subprocess.run(cmd, shell=True)    print(f'已将调整大小的视频保存为 {output_filename}')    return output_filename# 创建一个调用upload_video的表单按钮,并创建一个用于调整大小的复选框import ipywidgets as widgetsfrom IPython.display import displaybutton = widgets.Button(description="上传视频")checkbox = widgets.Checkbox(value=False, description='调整为720p(获得更好的结果)')output = widgets.Output()def on_button_clicked(b):  with output:    global video_path    global resize_to_720p    resize_to_720p = checkbox.value    video_path = upload_video()button.on_click(on_button_clicked)display(checkbox, button, output)

这将输出一个用于从本地设备上传视频的表单按钮,以及一个用于启用720p调整大小的复选框。您也可以手动将视频上传到当前的collab会话,并使用子进程调整它的大小。

步骤3:音频提取和Whisper转录

现在我们有了视频,接下来要做的是使用FFmpeg提取音频,并使用Whisper进行转录。

#@title 音频提取(24位)和Whisper转换import subprocess# 确保video_path变量存在且不为Noneif 'video_path' in globals() and video_path is not None:    ffmpeg_command = f"ffmpeg -i '{video_path}' -acodec pcm_s24le -ar 48000 -q:a 0 -map a\                       -y 'output_audio.wav'"    subprocess.run(ffmpeg_command, shell=True)else:    print("未上传任何视频。请先上传一个视频。")import whispermodel = whisper.load_model("base")result = model.transcribe("output_audio.wav")whisper_text = result["text"]whisper_language = result['language']print("Whisper文本:", whisper_text)

这将以24位格式从视频中提取音频,并使用Whisper Base进行转录。为了获得更好的转录结果,可以使用Whisper small或VoAGI模型。

步骤4:语音合成

现在,进入语音克隆部分。就像我之前提到的那样,我们将使用Coqui-ai的xTTS模型。这是目前为止最好的开源模型之一,用于语音合成。Coqui-ai还提供了许多适用于不同目的的TTS模型,请务必查看一下。对于我们的用例,也就是语音克隆,我们将使用xTTS v2模型。

加载xTTS模型。这是一个体积为1.87 GB的大模型,所以这需要一些时间。

#@title 语音合成from TTS.api import TTSimport torchfrom IPython.display import Audio, display  # 导入Audio和display模块device = "cuda" if torch.cuda.is_available() else "cpu"# 初始化TTStts = TTS("tts_models/multilingual/multi-dataset/xtts_v2").to(device)

XTTS目前支持16种语言。这是xTTS模型支持的语言的ISO码。

print(tts.languages)['en','es','fr','de','it','pt','pl','tr','ru','nl','cs','ar','zh-cn','hu','ko','ja','hi']

注意:像英语和法语这样的语言没有字符限制,而印地语的字符限制为250个。其他一些语言可能也有限制。

对于这个项目,我们将使用印地语,您也可以尝试其他语言。

所以,我们现在需要做的第一件事是将转录的文本翻译成印地语。这可以通过Google翻译包或使用LLM来完成。据我观察,GPT-3.5-Turbo比Google翻译效果要好得多。我们可以使用OpenAI API来获取我们的翻译。

import openaiclient = openai.OpenAI(api_key = "api_key")completion = client.chat.completions.create(  model="gpt-3.5-turbo",  messages=[    {"role": "system", "content": "您是一个有帮助的助手。"},    {"role": "user", "content": f"将文本翻译成印地语{whisper_text}"}  ])translated_text = completion.choices[0].messageprint(translated_text)

正如我们所知,印地语有字符限制,因此在将其传递给TTS模型之前,我们需要对文本进行预处理。我们需要将文本拆分为不超过250个字符的片段。

text_chunks = translated_text.split(sep = "।")final_chunks = [""]for chunk in text_chunks:  if not final_chunks[-1] or len(final_chunks[-1])+len(chunk)<250:    chunk += "।"    final_chunks[-1]+=chunk.strip()  else:    final_chunks.append(chunk+"।".strip())final_chunks

这是一个非常简单的分割器。您可以创建一个不同的分割器,或者使用Langchain的递归文本分割器。现在,我们将每个块传递给TTS模型。使用FFmpeg将生成的音频文件合并。

def audio_synthesis(text, file_name):  tts.tts_to_file(      text,      speaker_wav='output_audio.wav',      file_path=file_name,      language="hi"  )  return file_namefile_names = []for i in range(len(final_chunks)):    file_name = audio_synthesis(final_chunks[i], f"output_synth_audio_{i}.wav")    file_names.append(file_name)

由于所有文件具有相同的编解码器,因此我们可以使用FFmpeg轻松将它们合并在一起。为此,请创建一个Txt文件并添加文件路径。

# 这是一个注释file 'output_synth_audio_0.wav'file 'output_synth_audio_1.wav'file 'output_synth_audio_2.wav'

现在,运行以下代码将文件合并。

import subprocesscmd = "ffmpeg -f concat -safe 0 -i my_files.txt -c copy final_output_synth_audio_hi.wav"subprocess.run(cmd, shell=True)

这将输出最终合并的音频文件。您还可以在Colab中播放音频。

from IPython.display import Audio, displaydisplay(Audio(filename="final_output_synth_audio_hi.wav", autoplay=False))

步骤5:嘴唇同步

现在,到嘴唇同步的部分。为了将我们合成的音频与原始视频进行嘴唇同步,我们将使用Wav2lip仓库。要使用Wav2lip进行音频同步,我们需要安装模型检查点。但是在此之前,如果您正在使用T4 GPU运行时,请删除当前Colab会话中的xTTS和Whisper模型,或者重新启动会话。

import torchtry:    del ttsexcept NameError:    print("语音模型已删除")try:    del modelexcept NameError:    print("Whisper模型已删除")torch.cuda.empty_cache()

现在,克隆Wav2lip仓库并安装检查点。

# @title Dependencies%cd /content/!git clone https://github.com/justinjohn0306/Wav2Lip!cd Wav2Lip && pip install -r requirements_colab.txt%cd /content/Wav2Lip!wget 'https://github.com/justinjohn0306/Wav2Lip/releases \/download/models/wav2lip.pth' -O 'checkpoints/wav2lip.pth'!wget 'https://github.com/justinjohn0306/Wav2Lip/releases \/download/models/wav2lip_gan.pth' -O 'checkpoints/wav2lip_gan.pth'!wget 'https://github.com/justinjohn0306/Wav2Lip/releases \/download/models/mobilenet.pth' -O 'checkpoints/mobilenet.pth'!pip install batch-face

Wav2lip有两个模型用于唇语同步,分别是wav2lip和wav2lip_gan。根据模型的作者所说,GAN模型在人脸检测上需要的努力较少,但结果稍微逊色。相比之下,非GAN模型可以通过更多的手动padding和检测框的重新缩放产生更好的结果。您可以尝试两种模型,看哪个效果更好。

使用模型检查点路径、视频和音频文件进行推断。

%cd /content/Wav2Lip#这是检测框的padding,请根据效果调整#通常来说,底部是最大的问题pad_top =  0pad_bottom =  15pad_left =  0pad_right =  0rescaleFactor =  1video_path_fix = f"'../{video_path}'"!python inference.py --checkpoint_path 'checkpoints/wav2lip_gan.pth' \--face $video_path_fix --audio "/content/final_output_synth_audio_hi.wav" \--pads $pad_top $pad_bottom $pad_left $pad_right --resize_factor $rescaleFactor --nosmooth \ --outfile '/content/output_video.mp4'

这将输出一段唇语同步的视频。如果视频效果不好,请调整参数并重试。

所以,这是笔记本和一些示例的存储库。

GitHub存储库:sunilkumardash9/voice-clone-and-lip-sync

现实世界应用案例

视频语音克隆和唇语同步技术在各个行业中有很多应用案例。以下是一些有益的应用场景。

娱乐:娱乐行业是最受影响的行业之一。我们已经见证了变革。当前和过去明星的声音可以被合成并重新使用。这也带来了伦理挑战。合成声音的使用应该负责任,并在法律范围内进行。

营销:使用熟悉和可信赖的声音进行个性化广告活动可以大大增强品牌吸引力。

沟通:语言一直是各种活动的障碍。跨语言沟通仍然是一个挑战。保持个人口音和声音的实时端到端翻译将彻底改变我们沟通的方式。这可能在几年内成为现实。

内容创作:内容创作者将不再依赖翻译人员来扩大受众。通过高效的语音克隆和唇语同步,跨语言内容创作将变得更容易。语音合成可以增强播客和有声书的叙述体验。

结论

语音合成是生成AI中最受追捧的用例之一。它有潜力彻底改变我们沟通的方式。自人类文明产生以来,语言障碍一直是文化和商业上建立更深层次关系的障碍。通过AI语音合成,这个鸿沟可以被填补。所以,在这篇文章中,我们探索了语音克隆和唇语同步的开源方式。

关键要点

  • TTS是Coqui-ai的一个Python库,用于提供和维护流行的文本到语音模型。
  • xTTS是一个多语言语音克隆模型,能够克隆16种不同语言的声音。
  • Whisper是OpenAI的一个ASR模型,用于高效的转录和英文翻译。
  • Wav2lip是一个用于唇语同步视频的开源工具。
  • 语音克隆是生成AI领域最热门的前沿之一,对从娱乐到营销的行业都有重要的潜在影响。

常见问题解答

本文中显示的媒体不归Analytics Vidhya所有,仅用于作者的自由裁量。

Leave a Reply

Your email address will not be published. Required fields are marked *