Come clonare la voce e sincronizzare le labbra di un video come un professionista utilizzando strumenti open-source

Clonare la voce e sincronizzare le labbra di un video con maestria, utilizzando strumenti open-source come un vero professionista

Introduzione

La clonazione vocale dell’IA ha fatto impazzire i social media. Ha aperto un mondo di possibilità creative. Avrai sicuramente visto meme o doppiaggi vocali dell’IA di personaggi famosi sui social media. Ti sei mai chiesto come si fa? Sicuramente molte piattaforme forniscono API come Eleven Labs, ma possiamo farlo gratuitamente usando software open source? La risposta breve è SÌ. L’open source offre modelli TTS e strumenti di sincronizzazione labiale per realizzare la sintesi vocale. Quindi, in questo articolo, esploreremo strumenti e modelli open source per la clonazione vocale e la sincronizzazione labiale.

Obiettivi di apprendimento

  • Esplorare strumenti open source per la clonazione vocale e la sincronizzazione labiale dell’IA.
  • Utilizzare FFmpeg e Whisper per trascrivere video.
  • Utilizzare il modello xTTS di Coqui-AI per clonare la voce.
  • Utilizzare il Wav2Lip per la sincronizzazione labiale dei video.
  • Esplorare casi d’uso reali di questa tecnologia.

Questo articolo è stato pubblicato come parte del Data Science Blogathon.

Stack open source

Come già sai, useremo Whisper di OpenAI, FFmpeg, il modello xTTS di Coqui-ai e Wav2lip come stack tecnologico. Ma prima di immergerci nei codici, discutiamo brevemente di questi strumenti. E grazie anche agli autori di questi progetti.

Whisper: Whisper è il modello ASR (Automatic Speech Recognition) di OpenAI. È un modello di trasformatore codificatore-decodificatore addestrato con oltre 650.000 ore di dati audio diversi e trascrizioni corrispondenti. Ciò lo rende molto potente nell’essere una trascrizione multilingue dall’audio.

Gli encoder ricevono lo spettrogramma log-mel di frammenti audio di 30 secondi. Ogni blocco di encoder utilizza l’autoattenzione per comprendere diverse parti dei segnali audio. Il decodificatore riceve quindi informazioni sullo stato nascosto dagli encoder e codifiche posizionali apprese. Il decodificatore utilizza l’autoattenzione e la cross-attenzione per prevedere il token successivo. Alla fine del processo, restituisce una sequenza di token che rappresentano il testo riconosciuto. Per ulteriori informazioni su Whisper, fare riferimento al repository ufficiale.

Coqui TTS: TTS è una libreria open-source di Coqui-ai. Ospita modelli di text-to-speech end-to-end come Bark, Tortoise e xTTS, modelli di spettrogramma come Glow-TTS, FastSpeech, ecc e Vocoder come Hifi-GAN, MelGAN, ecc. Inoltre, fornisce un’API unificata per l’inferenza, il fine-tuning e la formazione di modelli di text-to-speech. In questo progetto, utilizzeremo xTTS, un modello di clonazione vocale multilingue. Supporta 16 lingue, tra cui inglese, giapponese, hindi, mandarino, ecc. Per ulteriori informazioni sul TTS, fare riferimento al repository ufficiale di TTS.

Wav2Lip: Wav2Lip è un repository Python per il paper “A Lip Sync Expert Is All You Need for Speech to Lip Generation in the Wild”. Utilizza un discriminatore di sincronizzazione labiale per riconoscere movimenti del viso e delle labbra. Questo funziona molto bene per il doppiaggio delle voci. Per ulteriori informazioni, fare riferimento al repository ufficiale. Utilizzeremo questo fork del repository di Wav2lip.

Workflow

Ora che siamo familiari con gli strumenti e i modelli che utilizzeremo, comprendiamo il workflow. Questo è un workflow semplice. Quindi, ecco cosa faremo.

  • Caricare un video nell’ambiente di esecuzione di Colab e ridimensionarlo al formato 720p per una migliore sincronizzazione labiale.
  • Utilizzare FFmpeg per estrarre audio a 24 bit dal video e utilizzare Whisper per trascrivere il file audio.
  • Utilizzare Google Translate o un LLM per tradurre la sceneggiatura trascritta in un’altra lingua.
  • Caricare il modello xTTS multilingue con la libreria TTS e passare la sceneggiatura e il modello audio di riferimento per la sintesi vocale.
  • Clonare il repository di Wav2lip e scaricare i checkpoint del modello. Eseguire il file inference.py per sincronizzare il video originale con l’audio sintetizzato.

Ora, immergiamoci nei codici.

Passo 1: Installa le dipendenze

Questo progetto richiederà un consumo significativo di RAM e GPU, quindi è prudente utilizzare un runtime di Colab. Il Colab di livello gratuito fornisce 12 GB di CPU e 15 GB di GPU T4, che dovrebbero essere sufficienti per questo progetto. Quindi, vai al tuo Colab e connettiti a un runtime di GPU.

Ora, installa il TTS e il Whisper.

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

Passo 2: Carica i video su Colab

Ora, caricheremo un video e lo ridimensioneremo nel formato 720p. Il Wav2lip tende a funzionare meglio quando i video sono nel formato 720p. Questo può essere fatto utilizzando FFmpeg.

#@title Carica il video da google.colab import filesimport osimport subprocessuploaded = Noneresize_to_720p = Falsedef upload_video():  global uploaded  global video_path  # Dichiara video_path come globale per poterlo modificare  uploaded = files.upload()  for filename in uploaded.keys():    print(f'Caricato {filename}')    if resize_to_720p:        filename = resize_video(filename)  # Ottieni il nome del video ridimensionato    video_path = filename  # Aggiorna video_path con il nome del file originale o ridimensionato    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'Video ridimensionato salvato come {output_filename}')    return output_filename# Crea un pulsante del modulo che richiama upload_video quando viene cliccato e una casella di controllo per il ridimensionamentofrom import ipywidgets as widgetsfrom IPython.display import displaybutton = widgets.Button(description="Carica video")checkbox = widgets.Checkbox(value=False, description='Ridimensiona a 720p (migliori risultati)')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)

Ciò produrrà un pulsante del modulo per caricare video da un dispositivo locale e una casella di controllo per abilitare il ridimensionamento a 720p. È anche possibile caricare manualmente un video nella sessione Collab corrente e ridimensionarlo utilizzando un subprocess.

Passo 3: Estrazione audio e trascrizione Whisper

Ora che abbiamo il nostro video, la prossima cosa da fare è estrarre l’audio utilizzando FFmpeg e utilizzare Whisper per la trascrizione.

# @title Estrazione audio (24 bit) e conversione Whisperimport subprocess# Assicurati che la variabile video_path esista e non sia 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("Nessun video caricato. Carica prima un video.")import whispermodel = whisper.load_model("base")result = model.transcribe("output_audio.wav")whisper_text = result["text"]whisper_language = result['language']print("Testo Whisper:", whis

XTTS supporta attualmente 16 lingue. Ecco i codici ISO delle lingue supportate dal modello xTTS.

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

Nota: Lingue come l'inglese e il francese non hanno un limite di caratteri, mentre l'hindi ha un limite di 250 caratteri. Altre lingue potrebbero avere anche un limite.

Per questo progetto, useremo la lingua hindi, ma puoi sperimentare anche con altre.

Quindi, la prima cosa che ci serve ora è tradurre il testo trascritto in hindi. Questo può essere fatto sia utilizzando il pacchetto Google Translate che utilizzando un LLM. Sulla base delle mie osservazioni, GPT-3.5-Turbo funziona molto meglio di Google Translate. Possiamo utilizzare l'API di OpenAI per ottenere la nostra traduzione.

import openaiclient = openai.OpenAI(api_key = "api_key")completion = client.chat.completions.create(  model="gpt-3.5-turbo",  messages=[    {"role": "system", "content": "You are a helpful assistant."},    {"role": "user", "content": f"traduci i testi in hindi {whisper_text}"}  ])translated_text = completion.choices[0].messageprint(translated_text)

Come sappiamo, l'hindi ha un limite di caratteri, quindi dobbiamo eseguire un pre-processing del testo prima di passarlo al modello TTS. Dobbiamo suddividere il testo in pezzi di meno di 250 caratteri.

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

Questo è un semplice splitter. Puoi crearne uno diverso o utilizzare il text-splitter ricorsivo di Langchain. Ora, passeremo ogni pezzo al modello TTS. I file audio risultanti verranno uniti utilizzando 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)

Poiché tutti i file hanno lo stesso codec, possiamo unirli facilmente con FFmpeg. Per fare ciò, crea un file Txt e aggiungi i percorsi dei file.

# questo è un commento file 'output_synth_audio_0.wav'file 'output_synth_audio_1.wav'file 'output_synth_audio_2.wav'

Ora, esegui il codice qui sotto per unire i file.

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

Questo produrrà il file audio finale concatenato. Puoi anche riprodurre l'audio in Colab.

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

Passaggio 5: Lip-Syncing

Ora, passiamo alla parte di lip-syncing. Per sincronizzare il nostro audio sintetico con il video originale, utilizzeremo il repository Wav2lip. Per utilizzare Wav2lip per la sincronizzazione audio, dobbiamo installare i checkpoint del modello. Ma prima di ciò, se sei in esecuzione su T4 GPU, elimina i modelli xTTS e Whisper dalla sessione Colab corrente o riavvia la sessione.

import torchtry:    del ttsexcept NameError:    print("Modello vocale già eliminato")try:    del modelexcept NameError:    print("Modello Whisper eliminato")torch.cuda.empty_cache()

Ora, clona il repository Wav2lip e installa i checkpoint.

# @title Dipendenze%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

Il Wav2lip ha due modelli per la sincronizzazione delle labbra. wav2lip e wav2lip_gan. Secondo gli autori dei modelli, il modello GAN richiede meno sforzo per il rilevamento del viso ma produce risultati leggermente inferiori. Al contrario, il modello non-GAN può produrre risultati migliori con un'elaborazione manuale delle dimensioni e della posizione della casella di rilevamento. Puoi provare entrambi e vedere quale funziona meglio.

Esegui l'inferenza con il percorso del punto di controllo del modello, i file video e audio.

%cd /content/Wav2Lip# Questo è il padding della casella di rilevamentoadatta in caso di risultati scadenti. # Di solito, il problema maggiore è nella parte inferiorepad_superiore = 0pad_inferiore = 15pad_sinistra = 0pad_destra = 0fattore_dimensione = 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_superiore $pad_inferiore $pad_sinistra $pad_destra --fattore_dimensione $fattore_dimensione --no_ssmooth \ --outfile '/content/output_video.mp4'

Ciò produrrà un video sincronizzato con le labbra. Se il video non sembra buono, regola i parametri e riprova.

Quindi, ecco il repository del notebook e alcuni esempi.

Repository GitHub: sunilkumardash9/voice-clone-and-lip-sync

Casi d'uso reali

La tecnologia di clonazione della voce e sincronizzazione delle labbra ha molteplici utilizzi in diversi settori. Ecco alcuni casi in cui può essere utile.

Intrattenimento: L'industria dell'intrattenimento sarà l'industria più colpita di tutte. Stiamo già assistendo al cambiamento. Le voci di celebrità dell'attualità e del passato possono essere sintetizzate e riutilizzate. Ciò comporta anche sfide etiche. L'uso di voci sintetizzate dovrebbe essere fatto in modo responsabile e nel rispetto delle leggi.

Marketing: Le campagne pubblicitarie personalizzate con voci familiari e riconoscibili possono aumentare notevolmente l'appeal del marchio.

Comunicazione: La lingua è sempre stata un ostacolo per ogni tipo di attività. La comunicazione tra lingue diverse è ancora una sfida. La traduzione in tempo reale dall'inizio alla fine, mantenendo accento e voce, rivoluzionerà il modo in cui ci comunichiamo. Questo potrebbe diventare realtà nei prossimi anni.

Creazione di contenuti: I creatori di contenuti non dipenderanno più dai traduttori per raggiungere un pubblico più ampio. Con una clonazione vocale e una sincronizzazione delle labbra efficienti, la creazione di contenuti multilingue sarà più facile. L'esperienza di podcast e la narrazione di audiolibri possono essere migliorate con la sintesi vocale.

Conclusione

La sintesi vocale è uno dei casi d'uso più ricercati dell'AI generativa. Ha il potenziale per rivoluzionare il modo in cui ci comuniciamo. Fin dalla creazione delle civiltà, la barriera linguistica tra le comunità è stata un ostacolo per costruire relazioni più profonde, culturalmente e commercialmente. Con la sintesi vocale dell'IA, questo divario può essere colmato. Quindi, in questo articolo, abbiamo esplorato il modo open-source di clonare la voce e sincronizzare le labbra.

Punti chiave

  • TTS, una libreria Python di Coqui-ai, offre e mantiene modelli popolari di sintesi vocale.
  • L'xTTS è un modello di clonazione vocale multilingue in grado di clonare la voce in 16 lingue diverse.
  • Whisper è un modello ASR di OpenAI per la trascrizione efficiente e la traduzione in inglese.
  • Wav2lip è uno strumento open-source per la sincronizzazione delle labbra nei video.
  • La clonazione vocale è una delle frontiere più interessanti dell'IA generativa, con un impatto potenziale significativo su settori dall'intrattenimento al marketing.

Domande frequenti

I media mostrati in questo articolo non sono di proprietà di Analytics Vidhya e sono utilizzati a discrezione dell'autore.