EC2 Default User
commited on
Commit
·
82fb340
1
Parent(s):
7ccf97f
Fixing order of importation of modules
Browse files- app.py +241 -1
- utils/modules.py +0 -242
app.py
CHANGED
|
@@ -12,7 +12,247 @@ VOICE_PATH = "utils/"
|
|
| 12 |
# add libraries into environment
|
| 13 |
sys.path.append(VOICE_PATH) # set this if modules and voice are not installed globally
|
| 14 |
from utils.voice import *
|
| 15 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 16 |
#Definition Web App in Gradio
|
| 17 |
text_to_say=gr.inputs.Textbox(label='What would you like the voice to say? (max. 2000 characters per request)')
|
| 18 |
url =gr.inputs.Textbox(label = "Enter the YouTube URL below:")
|
|
|
|
| 12 |
# add libraries into environment
|
| 13 |
sys.path.append(VOICE_PATH) # set this if modules and voice are not installed globally
|
| 14 |
from utils.voice import *
|
| 15 |
+
# Modules for the Video Messsage Generator From Youtube
|
| 16 |
+
from IPython.display import HTML, Audio
|
| 17 |
+
from base64 import b64decode
|
| 18 |
+
import numpy as np
|
| 19 |
+
from scipy.io.wavfile import read as wav_read
|
| 20 |
+
import io
|
| 21 |
+
import ffmpeg
|
| 22 |
+
from pytube import YouTube
|
| 23 |
+
import random
|
| 24 |
+
from subprocess import call
|
| 25 |
+
from datetime import datetime
|
| 26 |
+
|
| 27 |
+
def time_between(t1, t2):
|
| 28 |
+
FMT = '%H:%M:%S'
|
| 29 |
+
t1 = datetime.strptime(t1, FMT)
|
| 30 |
+
t2 = datetime.strptime(t2, FMT)
|
| 31 |
+
delta = t2 - t1
|
| 32 |
+
return str(delta)
|
| 33 |
+
|
| 34 |
+
def download_video(url):
|
| 35 |
+
|
| 36 |
+
print("Downloading...")
|
| 37 |
+
local_file = (
|
| 38 |
+
YouTube(url)
|
| 39 |
+
.streams.filter(progressive=True, file_extension="mp4")
|
| 40 |
+
.first()
|
| 41 |
+
.download(filename="youtube{}.mp4".format(random.randint(0, 10000)))
|
| 42 |
+
)
|
| 43 |
+
print("Downloaded")
|
| 44 |
+
return local_file
|
| 45 |
+
# download(output_path=destination, filename="name.mp4")
|
| 46 |
+
|
| 47 |
+
|
| 48 |
+
def download_youtube(url):
|
| 49 |
+
#Select a Youtube Video
|
| 50 |
+
#find youtube video id
|
| 51 |
+
from urllib import parse as urlparse
|
| 52 |
+
url_data = urlparse.urlparse(url)
|
| 53 |
+
query = urlparse.parse_qs(url_data.query)
|
| 54 |
+
YOUTUBE_ID = query["v"][0]
|
| 55 |
+
url_download ="https://www.youtube.com/watch?v={}".format(YOUTUBE_ID)
|
| 56 |
+
# download the youtube with the given ID
|
| 57 |
+
os.system("{} youtube-dl -f mp4 --output youtube.mp4 '{}'".format(env,url_download))
|
| 58 |
+
return "youtube.mp4"
|
| 59 |
+
|
| 60 |
+
|
| 61 |
+
|
| 62 |
+
def cleanup():
|
| 63 |
+
import pathlib
|
| 64 |
+
import glob
|
| 65 |
+
types = ('*.mp4','*.mp3', '*.wav') # the tuple of file types
|
| 66 |
+
#Finding mp4 and wave files
|
| 67 |
+
junks = []
|
| 68 |
+
for files in types:
|
| 69 |
+
junks.extend(glob.glob(files))
|
| 70 |
+
try:
|
| 71 |
+
# Deleting those files
|
| 72 |
+
for junk in junks:
|
| 73 |
+
print("Deleting",junk)
|
| 74 |
+
# Setting the path for the file to delete
|
| 75 |
+
file = pathlib.Path(junk)
|
| 76 |
+
# Calling the unlink method on the path
|
| 77 |
+
file.unlink()
|
| 78 |
+
except Exception:
|
| 79 |
+
print("I cannot delete the file because it is being used by another process")
|
| 80 |
+
|
| 81 |
+
|
| 82 |
+
def clean_data():
|
| 83 |
+
# importing all necessary libraries
|
| 84 |
+
import sys, os
|
| 85 |
+
# initial directory
|
| 86 |
+
home_dir = os.getcwd()
|
| 87 |
+
# some non existing directory
|
| 88 |
+
fd = 'sample_data/'
|
| 89 |
+
# Join various path components
|
| 90 |
+
path_to_clean=os.path.join(home_dir,fd)
|
| 91 |
+
print("Path to clean:",path_to_clean)
|
| 92 |
+
# trying to insert to false directory
|
| 93 |
+
try:
|
| 94 |
+
os.chdir(path_to_clean)
|
| 95 |
+
print("Inside to clean", os.getcwd())
|
| 96 |
+
cleanup()
|
| 97 |
+
# Caching the exception
|
| 98 |
+
except:
|
| 99 |
+
print("Something wrong with specified\
|
| 100 |
+
directory. Exception- ", sys.exc_info())
|
| 101 |
+
# handling with finally
|
| 102 |
+
finally:
|
| 103 |
+
print("Restoring the path")
|
| 104 |
+
os.chdir(home_dir)
|
| 105 |
+
print("Current directory is-", os.getcwd())
|
| 106 |
+
|
| 107 |
+
def youtube_trim(url,start,end):
|
| 108 |
+
#cancel previous youtube
|
| 109 |
+
cleanup()
|
| 110 |
+
#download youtube
|
| 111 |
+
#download_youtube(url) # with youtube-dl (slow)
|
| 112 |
+
input_videos=download_video(url)
|
| 113 |
+
# Get the current working directory
|
| 114 |
+
parent_dir = os.getcwd()
|
| 115 |
+
# Trim the video (start, end) seconds
|
| 116 |
+
start = start
|
| 117 |
+
end = end
|
| 118 |
+
#Note: the trimmed video must have face on all frames
|
| 119 |
+
#interval = end - start
|
| 120 |
+
interval = time_between(start, end)
|
| 121 |
+
#trimmed_video= parent_dir+'/sample_data/input_vid{}.mp4'.format(random.randint(0, 10000))
|
| 122 |
+
#trimmed_audio= parent_dir+'/sample_data/input_audio{}.mp3'.format(random.randint(0, 10000))
|
| 123 |
+
trimmed_video= parent_dir+'/sample_data/input_video.mp4'
|
| 124 |
+
trimmed_audio= parent_dir+'/sample_data/input_audio.mp3'
|
| 125 |
+
#delete trimmed if already exits
|
| 126 |
+
clean_data()
|
| 127 |
+
#call(["rm","-f",trimmed_audio])
|
| 128 |
+
#call(["rm","-f",trimmed_video])
|
| 129 |
+
|
| 130 |
+
#!rm -f {trimmed_video}
|
| 131 |
+
# cut the video
|
| 132 |
+
call(["ffmpeg","-y","-i",input_videos,"-ss", start,"-t",interval,"-async","1",trimmed_video])
|
| 133 |
+
#!ffmpeg -y -i youtube.mp4 -ss {start} -t {interval} -async 1 {trimmed_video}
|
| 134 |
+
# cut the audio
|
| 135 |
+
call(["ffmpeg","-i",trimmed_video, "-q:a", "0", "-map","a",trimmed_audio])
|
| 136 |
+
#Preview trimmed video
|
| 137 |
+
#clear_output()
|
| 138 |
+
print("Trimmed Video+Audio")
|
| 139 |
+
return trimmed_video, trimmed_audio
|
| 140 |
+
|
| 141 |
+
def create_video(Text,Voicetoclone):
|
| 142 |
+
out_audio=greet(Text,Voicetoclone)
|
| 143 |
+
current_dir=os.getcwd()
|
| 144 |
+
clonned_audio = os.path.join(current_dir, out_audio)
|
| 145 |
+
|
| 146 |
+
#Start Crunching and Preview Output
|
| 147 |
+
#Note: Only change these, if you have to
|
| 148 |
+
pad_top = 0#@param {type:"integer"}
|
| 149 |
+
pad_bottom = 10#@param {type:"integer"}
|
| 150 |
+
pad_left = 0#@param {type:"integer"}
|
| 151 |
+
pad_right = 0#@param {type:"integer"}
|
| 152 |
+
rescaleFactor = 1#@param {type:"integer"}
|
| 153 |
+
nosmooth = False #@param {type:"boolean"}
|
| 154 |
+
|
| 155 |
+
out_name ="result_voice_{}.mp4".format(random.randint(0, 10000))
|
| 156 |
+
out_file="../"+out_name
|
| 157 |
+
|
| 158 |
+
if nosmooth == False:
|
| 159 |
+
os.system('{} cd Wav2Lip && python inference.py --checkpoint_path checkpoints/wav2lip_gan.pth --face "../sample_data/input_video.mp4" --audio "../out/clonned_audio.wav" --outfile {} --pads {} {} {} {} --resize_factor {}'.format(env,out_file,pad_top ,pad_bottom ,pad_left ,pad_right ,rescaleFactor))
|
| 160 |
+
else:
|
| 161 |
+
os.system('{} cd Wav2Lip && python inference.py --checkpoint_path checkpoints/wav2lip_gan.pth --face "../sample_data/input_video.mp4" --audio "../out/clonned_audio.wav" --outfile {} --pads {} {} {} {} --resize_factor {} --nosmooth'.format(env,out_file,pad_top ,pad_bottom ,pad_left ,pad_right ,rescaleFactor))
|
| 162 |
+
|
| 163 |
+
#clear_output()
|
| 164 |
+
print("Creation of Video done")
|
| 165 |
+
return out_name
|
| 166 |
+
|
| 167 |
+
|
| 168 |
+
def time_format_check(input1):
|
| 169 |
+
timeformat = "%H:%M:%S"
|
| 170 |
+
#input1 = input("At what time did sensor 1 actuate? ")
|
| 171 |
+
try:
|
| 172 |
+
validtime = datetime.strptime(input1, timeformat)
|
| 173 |
+
print("The time format is valid", input1)
|
| 174 |
+
#Do your logic with validtime, which is a valid format
|
| 175 |
+
return False
|
| 176 |
+
except ValueError:
|
| 177 |
+
print("The time {} has not valid format hh:mm:ss".format(input1))
|
| 178 |
+
return True
|
| 179 |
+
|
| 180 |
+
|
| 181 |
+
def to_seconds(datetime_obj):
|
| 182 |
+
from datetime import datetime
|
| 183 |
+
time =datetime_obj
|
| 184 |
+
date_time = datetime.strptime(time, "%H:%M:%S")
|
| 185 |
+
a_timedelta = date_time - datetime(1900, 1, 1)
|
| 186 |
+
seconds = a_timedelta.total_seconds()
|
| 187 |
+
return seconds
|
| 188 |
+
|
| 189 |
+
|
| 190 |
+
def validate_youtube(url):
|
| 191 |
+
#This creates a youtube objet
|
| 192 |
+
try:
|
| 193 |
+
yt = YouTube(url)
|
| 194 |
+
except Exception:
|
| 195 |
+
print("Hi there URL seems invalid")
|
| 196 |
+
return True, 0
|
| 197 |
+
#This will return the length of the video in sec as an int
|
| 198 |
+
video_length = yt.length
|
| 199 |
+
if video_length > 600:
|
| 200 |
+
print("Your video is larger than 10 minutes")
|
| 201 |
+
return True, video_length
|
| 202 |
+
else:
|
| 203 |
+
print("Your video is less than 10 minutes")
|
| 204 |
+
return False, video_length
|
| 205 |
+
|
| 206 |
+
|
| 207 |
+
def video_generator(text_to_say,url,initial_time,final_time):
|
| 208 |
+
print('Checking the url',url)
|
| 209 |
+
check1, video_length = validate_youtube(url)
|
| 210 |
+
if check1 is True: return "./demo/tryagain2.mp4"
|
| 211 |
+
check2 = validate_time(initial_time,final_time, video_length)
|
| 212 |
+
if check2 is True: return "./demo/tryagain0.mp4"
|
| 213 |
+
trimmed_video, trimmed_audio=youtube_trim(url,initial_time,final_time)
|
| 214 |
+
voicetoclone=trimmed_audio
|
| 215 |
+
print(voicetoclone)
|
| 216 |
+
outvideo=create_video(text_to_say,voicetoclone)
|
| 217 |
+
#Preview output video
|
| 218 |
+
print("Final Video Preview")
|
| 219 |
+
final_video= parent_dir+'/'+outvideo
|
| 220 |
+
print("DONE")
|
| 221 |
+
#showVideo(final_video)
|
| 222 |
+
return final_video
|
| 223 |
+
|
| 224 |
+
|
| 225 |
+
def validate_time(initial_time,final_time,video_length):
|
| 226 |
+
is_wrong1=time_format_check(initial_time)
|
| 227 |
+
is_wrong2=time_format_check(final_time)
|
| 228 |
+
#print(is_wrong1,is_wrong2)
|
| 229 |
+
if is_wrong1 is False and is_wrong2 is False:
|
| 230 |
+
delta=time_between(initial_time,final_time)
|
| 231 |
+
if len(str(delta)) > 8:
|
| 232 |
+
print("Final Time is Smaller than Initial Time: t1>t2")
|
| 233 |
+
is_wrong = True
|
| 234 |
+
return is_wrong
|
| 235 |
+
else:
|
| 236 |
+
print("OK")
|
| 237 |
+
is_wrong=False
|
| 238 |
+
if int(to_seconds(delta)) > 300 :
|
| 239 |
+
print("The trim is larger than 5 minutes")
|
| 240 |
+
is_wrong = True
|
| 241 |
+
return is_wrong
|
| 242 |
+
|
| 243 |
+
elif int(to_seconds(delta)) > video_length :
|
| 244 |
+
print("The trim is larger than video lenght")
|
| 245 |
+
is_wrong = True
|
| 246 |
+
return is_wrong
|
| 247 |
+
else:
|
| 248 |
+
return is_wrong
|
| 249 |
+
|
| 250 |
+
else:
|
| 251 |
+
print("Your time format is invalid")
|
| 252 |
+
is_wrong = True
|
| 253 |
+
return is_wrong
|
| 254 |
+
|
| 255 |
+
|
| 256 |
#Definition Web App in Gradio
|
| 257 |
text_to_say=gr.inputs.Textbox(label='What would you like the voice to say? (max. 2000 characters per request)')
|
| 258 |
url =gr.inputs.Textbox(label = "Enter the YouTube URL below:")
|
utils/modules.py
DELETED
|
@@ -1,242 +0,0 @@
|
|
| 1 |
-
# Modules for the Video Messsage Generator From Youtube
|
| 2 |
-
|
| 3 |
-
from IPython.display import HTML, Audio
|
| 4 |
-
from base64 import b64decode
|
| 5 |
-
import numpy as np
|
| 6 |
-
from scipy.io.wavfile import read as wav_read
|
| 7 |
-
import io
|
| 8 |
-
import ffmpeg
|
| 9 |
-
from pytube import YouTube
|
| 10 |
-
import random
|
| 11 |
-
from subprocess import call
|
| 12 |
-
import os
|
| 13 |
-
from datetime import datetime
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
def time_between(t1, t2):
|
| 17 |
-
FMT = '%H:%M:%S'
|
| 18 |
-
t1 = datetime.strptime(t1, FMT)
|
| 19 |
-
t2 = datetime.strptime(t2, FMT)
|
| 20 |
-
delta = t2 - t1
|
| 21 |
-
return str(delta)
|
| 22 |
-
|
| 23 |
-
def download_video(url):
|
| 24 |
-
|
| 25 |
-
print("Downloading...")
|
| 26 |
-
local_file = (
|
| 27 |
-
YouTube(url)
|
| 28 |
-
.streams.filter(progressive=True, file_extension="mp4")
|
| 29 |
-
.first()
|
| 30 |
-
.download(filename="youtube{}.mp4".format(random.randint(0, 10000)))
|
| 31 |
-
)
|
| 32 |
-
print("Downloaded")
|
| 33 |
-
return local_file
|
| 34 |
-
# download(output_path=destination, filename="name.mp4")
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
def download_youtube(url):
|
| 38 |
-
#Select a Youtube Video
|
| 39 |
-
#find youtube video id
|
| 40 |
-
from urllib import parse as urlparse
|
| 41 |
-
url_data = urlparse.urlparse(url)
|
| 42 |
-
query = urlparse.parse_qs(url_data.query)
|
| 43 |
-
YOUTUBE_ID = query["v"][0]
|
| 44 |
-
url_download ="https://www.youtube.com/watch?v={}".format(YOUTUBE_ID)
|
| 45 |
-
# download the youtube with the given ID
|
| 46 |
-
os.system("{} youtube-dl -f mp4 --output youtube.mp4 '{}'".format(env,url_download))
|
| 47 |
-
return "youtube.mp4"
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
def cleanup():
|
| 52 |
-
import pathlib
|
| 53 |
-
import glob
|
| 54 |
-
types = ('*.mp4','*.mp3', '*.wav') # the tuple of file types
|
| 55 |
-
#Finding mp4 and wave files
|
| 56 |
-
junks = []
|
| 57 |
-
for files in types:
|
| 58 |
-
junks.extend(glob.glob(files))
|
| 59 |
-
try:
|
| 60 |
-
# Deleting those files
|
| 61 |
-
for junk in junks:
|
| 62 |
-
print("Deleting",junk)
|
| 63 |
-
# Setting the path for the file to delete
|
| 64 |
-
file = pathlib.Path(junk)
|
| 65 |
-
# Calling the unlink method on the path
|
| 66 |
-
file.unlink()
|
| 67 |
-
except Exception:
|
| 68 |
-
print("I cannot delete the file because it is being used by another process")
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
def clean_data():
|
| 72 |
-
# importing all necessary libraries
|
| 73 |
-
import sys, os
|
| 74 |
-
# initial directory
|
| 75 |
-
home_dir = os.getcwd()
|
| 76 |
-
# some non existing directory
|
| 77 |
-
fd = 'sample_data/'
|
| 78 |
-
# Join various path components
|
| 79 |
-
path_to_clean=os.path.join(home_dir,fd)
|
| 80 |
-
print("Path to clean:",path_to_clean)
|
| 81 |
-
# trying to insert to false directory
|
| 82 |
-
try:
|
| 83 |
-
os.chdir(path_to_clean)
|
| 84 |
-
print("Inside to clean", os.getcwd())
|
| 85 |
-
cleanup()
|
| 86 |
-
# Caching the exception
|
| 87 |
-
except:
|
| 88 |
-
print("Something wrong with specified\
|
| 89 |
-
directory. Exception- ", sys.exc_info())
|
| 90 |
-
# handling with finally
|
| 91 |
-
finally:
|
| 92 |
-
print("Restoring the path")
|
| 93 |
-
os.chdir(home_dir)
|
| 94 |
-
print("Current directory is-", os.getcwd())
|
| 95 |
-
|
| 96 |
-
def youtube_trim(url,start,end):
|
| 97 |
-
#cancel previous youtube
|
| 98 |
-
cleanup()
|
| 99 |
-
#download youtube
|
| 100 |
-
#download_youtube(url) # with youtube-dl (slow)
|
| 101 |
-
input_videos=download_video(url)
|
| 102 |
-
# Get the current working directory
|
| 103 |
-
parent_dir = os.getcwd()
|
| 104 |
-
# Trim the video (start, end) seconds
|
| 105 |
-
start = start
|
| 106 |
-
end = end
|
| 107 |
-
#Note: the trimmed video must have face on all frames
|
| 108 |
-
#interval = end - start
|
| 109 |
-
interval = time_between(start, end)
|
| 110 |
-
#trimmed_video= parent_dir+'/sample_data/input_vid{}.mp4'.format(random.randint(0, 10000))
|
| 111 |
-
#trimmed_audio= parent_dir+'/sample_data/input_audio{}.mp3'.format(random.randint(0, 10000))
|
| 112 |
-
trimmed_video= parent_dir+'/sample_data/input_video.mp4'
|
| 113 |
-
trimmed_audio= parent_dir+'/sample_data/input_audio.mp3'
|
| 114 |
-
#delete trimmed if already exits
|
| 115 |
-
clean_data()
|
| 116 |
-
#call(["rm","-f",trimmed_audio])
|
| 117 |
-
#call(["rm","-f",trimmed_video])
|
| 118 |
-
|
| 119 |
-
#!rm -f {trimmed_video}
|
| 120 |
-
# cut the video
|
| 121 |
-
call(["ffmpeg","-y","-i",input_videos,"-ss", start,"-t",interval,"-async","1",trimmed_video])
|
| 122 |
-
#!ffmpeg -y -i youtube.mp4 -ss {start} -t {interval} -async 1 {trimmed_video}
|
| 123 |
-
# cut the audio
|
| 124 |
-
call(["ffmpeg","-i",trimmed_video, "-q:a", "0", "-map","a",trimmed_audio])
|
| 125 |
-
#Preview trimmed video
|
| 126 |
-
#clear_output()
|
| 127 |
-
print("Trimmed Video+Audio")
|
| 128 |
-
return trimmed_video, trimmed_audio
|
| 129 |
-
|
| 130 |
-
def create_video(Text,Voicetoclone):
|
| 131 |
-
out_audio=greet(Text,Voicetoclone)
|
| 132 |
-
current_dir=os.getcwd()
|
| 133 |
-
clonned_audio = os.path.join(current_dir, out_audio)
|
| 134 |
-
|
| 135 |
-
#Start Crunching and Preview Output
|
| 136 |
-
#Note: Only change these, if you have to
|
| 137 |
-
pad_top = 0#@param {type:"integer"}
|
| 138 |
-
pad_bottom = 10#@param {type:"integer"}
|
| 139 |
-
pad_left = 0#@param {type:"integer"}
|
| 140 |
-
pad_right = 0#@param {type:"integer"}
|
| 141 |
-
rescaleFactor = 1#@param {type:"integer"}
|
| 142 |
-
nosmooth = False #@param {type:"boolean"}
|
| 143 |
-
|
| 144 |
-
out_name ="result_voice_{}.mp4".format(random.randint(0, 10000))
|
| 145 |
-
out_file="../"+out_name
|
| 146 |
-
|
| 147 |
-
if nosmooth == False:
|
| 148 |
-
os.system('{} cd Wav2Lip && python inference.py --checkpoint_path checkpoints/wav2lip_gan.pth --face "../sample_data/input_video.mp4" --audio "../out/clonned_audio.wav" --outfile {} --pads {} {} {} {} --resize_factor {}'.format(env,out_file,pad_top ,pad_bottom ,pad_left ,pad_right ,rescaleFactor))
|
| 149 |
-
else:
|
| 150 |
-
os.system('{} cd Wav2Lip && python inference.py --checkpoint_path checkpoints/wav2lip_gan.pth --face "../sample_data/input_video.mp4" --audio "../out/clonned_audio.wav" --outfile {} --pads {} {} {} {} --resize_factor {} --nosmooth'.format(env,out_file,pad_top ,pad_bottom ,pad_left ,pad_right ,rescaleFactor))
|
| 151 |
-
|
| 152 |
-
#clear_output()
|
| 153 |
-
print("Creation of Video done")
|
| 154 |
-
return out_name
|
| 155 |
-
|
| 156 |
-
|
| 157 |
-
def time_format_check(input1):
|
| 158 |
-
timeformat = "%H:%M:%S"
|
| 159 |
-
#input1 = input("At what time did sensor 1 actuate? ")
|
| 160 |
-
try:
|
| 161 |
-
validtime = datetime.strptime(input1, timeformat)
|
| 162 |
-
print("The time format is valid", input1)
|
| 163 |
-
#Do your logic with validtime, which is a valid format
|
| 164 |
-
return False
|
| 165 |
-
except ValueError:
|
| 166 |
-
print("The time {} has not valid format hh:mm:ss".format(input1))
|
| 167 |
-
return True
|
| 168 |
-
|
| 169 |
-
|
| 170 |
-
def to_seconds(datetime_obj):
|
| 171 |
-
from datetime import datetime
|
| 172 |
-
time =datetime_obj
|
| 173 |
-
date_time = datetime.strptime(time, "%H:%M:%S")
|
| 174 |
-
a_timedelta = date_time - datetime(1900, 1, 1)
|
| 175 |
-
seconds = a_timedelta.total_seconds()
|
| 176 |
-
return seconds
|
| 177 |
-
|
| 178 |
-
|
| 179 |
-
def validate_youtube(url):
|
| 180 |
-
#This creates a youtube objet
|
| 181 |
-
try:
|
| 182 |
-
yt = YouTube(url)
|
| 183 |
-
except Exception:
|
| 184 |
-
print("Hi there URL seems invalid")
|
| 185 |
-
return True, 0
|
| 186 |
-
#This will return the length of the video in sec as an int
|
| 187 |
-
video_length = yt.length
|
| 188 |
-
if video_length > 600:
|
| 189 |
-
print("Your video is larger than 10 minutes")
|
| 190 |
-
return True, video_length
|
| 191 |
-
else:
|
| 192 |
-
print("Your video is less than 10 minutes")
|
| 193 |
-
return False, video_length
|
| 194 |
-
|
| 195 |
-
|
| 196 |
-
def video_generator(text_to_say,url,initial_time,final_time):
|
| 197 |
-
print('Checking the url',url)
|
| 198 |
-
check1, video_length = validate_youtube(url)
|
| 199 |
-
if check1 is True: return "./demo/tryagain2.mp4"
|
| 200 |
-
check2 = validate_time(initial_time,final_time, video_length)
|
| 201 |
-
if check2 is True: return "./demo/tryagain0.mp4"
|
| 202 |
-
trimmed_video, trimmed_audio=youtube_trim(url,initial_time,final_time)
|
| 203 |
-
voicetoclone=trimmed_audio
|
| 204 |
-
print(voicetoclone)
|
| 205 |
-
outvideo=create_video(text_to_say,voicetoclone)
|
| 206 |
-
#Preview output video
|
| 207 |
-
print("Final Video Preview")
|
| 208 |
-
final_video= parent_dir+'/'+outvideo
|
| 209 |
-
print("DONE")
|
| 210 |
-
#showVideo(final_video)
|
| 211 |
-
return final_video
|
| 212 |
-
|
| 213 |
-
|
| 214 |
-
def validate_time(initial_time,final_time,video_length):
|
| 215 |
-
is_wrong1=time_format_check(initial_time)
|
| 216 |
-
is_wrong2=time_format_check(final_time)
|
| 217 |
-
#print(is_wrong1,is_wrong2)
|
| 218 |
-
if is_wrong1 is False and is_wrong2 is False:
|
| 219 |
-
delta=time_between(initial_time,final_time)
|
| 220 |
-
if len(str(delta)) > 8:
|
| 221 |
-
print("Final Time is Smaller than Initial Time: t1>t2")
|
| 222 |
-
is_wrong = True
|
| 223 |
-
return is_wrong
|
| 224 |
-
else:
|
| 225 |
-
print("OK")
|
| 226 |
-
is_wrong=False
|
| 227 |
-
if int(to_seconds(delta)) > 300 :
|
| 228 |
-
print("The trim is larger than 5 minutes")
|
| 229 |
-
is_wrong = True
|
| 230 |
-
return is_wrong
|
| 231 |
-
|
| 232 |
-
elif int(to_seconds(delta)) > video_length :
|
| 233 |
-
print("The trim is larger than video lenght")
|
| 234 |
-
is_wrong = True
|
| 235 |
-
return is_wrong
|
| 236 |
-
else:
|
| 237 |
-
return is_wrong
|
| 238 |
-
|
| 239 |
-
else:
|
| 240 |
-
print("Your time format is invalid")
|
| 241 |
-
is_wrong = True
|
| 242 |
-
return is_wrong
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|