File size: 3,074 Bytes
61ba537
e60a003
61ba537
e60a003
 
0223aa3
e60a003
61ba537
 
 
 
0223aa3
 
 
 
 
 
 
 
 
61ba537
 
11a4759
61ba537
 
 
 
 
 
0223aa3
61ba537
 
 
e60a003
 
61ba537
 
 
 
 
11a4759
61ba537
11a4759
61ba537
 
 
 
 
 
 
 
e60a003
 
7db9974
 
 
 
 
 
 
 
e60a003
7db9974
 
e60a003
 
 
7db9974
e60a003
 
7db9974
 
 
e60a003
 
 
61ba537
e60a003
11a4759
 
 
 
e60a003
61ba537
11a4759
 
61ba537
11a4759
 
 
 
61ba537
11a4759
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import os
import shutil
import sys
from pathlib import Path

import requests
from gradio_client import Client

from main import call_wav2lip, call_gfpgan, merge

root_dir = '/content/jobs'
os.makedirs(root_dir, exist_ok=True)


def download_file(url, local_filename):
    response = requests.get(url, stream=True)
    with open(local_filename, 'wb') as file:
        for chunk in response.iter_content(chunk_size=8192):
            if chunk:
                file.write(chunk)


def main(job_id, text, video_url):
    job_path = os.path.join(root_dir, job_id)
    os.makedirs(job_path, exist_ok=True)

    if video_url.startswith('http'):
        video_file = os.path.basename(video_url)
        video_path = os.path.join(job_path, video_file)
        download_file(video_url, video_path)
    else:
        video_path = video_url

    audio_path = os.path.join(job_path, 'audio.mp3')
    gen_voice(text, audio_path)

    assert os.path.isfile(video_path), f'Video {video_path} not exist.'
    assert os.path.isfile(audio_path), f'Audio {audio_path} not exist.'

    wav2lip_mp4 = os.path.join(job_path, 'wav2lip.mp4')
    print('=' * 40)
    call_wav2lip(video_path, audio_path, wav2lip_mp4)
    print('=' * 40)
    call_gfpgan(wav2lip_mp4)

    output_filename = 'output.mp4'
    output_mp4 = os.path.join(job_path, output_filename)
    merge(job_path, audio_path, output_mp4)
    return output_mp4


def gen_voice(text, audio_path):
    ogg_path = Path(audio_path).with_suffix('.ogg')
    client = Client("https://digitalxingtong-ign-longread-bert-vits2.hf.space/")
    if os.path.isabs(text):
        path = text
    else:
        current_folder = os.path.dirname(os.path.abspath(__file__))
        path = os.path.join(current_folder, 'input.txt')
        with open(path, 'w') as file:
            file.write(text)
    result = client.predict(
        path,
        # str (filepath or URL to file) in '在这里上传TXT文件' File component
        0.2,  # int | float (numeric value between 0 and 1) in '语调变化' Slider component
        0.6,  # int | float (numeric value between 0.1 and 1.5) in '感情变化' Slider component
        0.8,  # int | float (numeric value between 0.1 and 1.4) in '音节发音长度变化' Slider component
        0.95,  # int | float (numeric value between 0.1 and 2) in '语速' Slider component
        fn_index=0
    )

    audio_file = result
    print(audio_file)
    shutil.move(audio_file, audio_path)


if __name__ == '__main__':
    """
job_id='2'
! python txt2video.py {job_id} 'https://image.tensorartassets.com/cdn-cgi/image/plain=true,w=1280/posts/images/631302687467566953/4873c256-c1bd-49ba-85ca-5821801f122f.jpg' 海狸今天我们出去走路么
from google.colab import files
files.download(f'/content/jobs/{job_id}/output.mp4')
    """
    job_id = sys.argv[1]
    text = sys.argv[2]  # text or .txt file
    video_url = sys.argv[3]

    if os.path.isfile(text):
        # read file as string
        with open(text, 'r') as file:
            text = file.read()

    output_mp4 = main(job_id, text, video_url)