|
@@ -18,6 +18,7 @@ import time
|
|
|
import math
|
|
|
import dataset
|
|
|
from datetime import datetime
|
|
|
+from gtts import gTTS
|
|
|
|
|
|
dir_sound = 'mp3_track/'
|
|
|
dir_photo = 'photo/'
|
|
@@ -76,30 +77,6 @@ def myunichchar(unicode_char):
|
|
|
unicode_char = chr(mb_string[0] << 8 | mb_string[1])
|
|
|
return unicode_char
|
|
|
|
|
|
-
|
|
|
-def file_prepare(name, name_hash,text_content,image_urls):
|
|
|
- #save image
|
|
|
- try:
|
|
|
- os.mkdir(dir_photo+name_hash)
|
|
|
- except FileExistsError:
|
|
|
- print("Directory " , dir_photo+name_hash , " already exists")
|
|
|
- img_num = 1
|
|
|
- for imgu in image_urls:
|
|
|
- im = Image.open(requests.get(imgu, stream=True).raw)
|
|
|
- im.save(dir_photo+name_hash+"/"+str(img_num)+".jpg")
|
|
|
- img_num+=1
|
|
|
- #save text
|
|
|
- text_file = open(dir_text+name_hash+".txt", "w")
|
|
|
- text_file.write(text_content)
|
|
|
- text_file.close()
|
|
|
- print("text file made")
|
|
|
- #make mp3
|
|
|
- tts = zhtts.TTS()
|
|
|
- tts.text2wav(text_content,dir_sound+name_hash+".mp3")
|
|
|
- print("mp3 file made")
|
|
|
- #make title as image
|
|
|
- txt2image(name, dir_title+name_hash+".png")
|
|
|
-
|
|
|
def get_url_type(url):
|
|
|
req = urllib.request.Request(url, method='HEAD', headers={'User-Agent': 'Mozilla/5.0'})
|
|
|
r = urllib.request.urlopen(req)
|
|
@@ -131,7 +108,7 @@ def make_dir(name_hash):
|
|
|
except FileExistsError:
|
|
|
print("~~~~~~Warning~~~~~~~~~Directory " , dir_subtitle+name_hash , " already exists")
|
|
|
|
|
|
-def file_prepare_v2(name, name_hash,text_content,image_urls):
|
|
|
+def file_prepare(name, name_hash,text_content,image_urls,lang):
|
|
|
make_dir(name_hash)
|
|
|
img_num = 1
|
|
|
for imgu in image_urls:
|
|
@@ -160,8 +137,12 @@ def file_prepare_v2(name, name_hash,text_content,image_urls):
|
|
|
language = 'zh-tw'
|
|
|
txt_idx = 0
|
|
|
for txt in text_content:
|
|
|
- tts = zhtts.TTS()
|
|
|
- tts.text2wav(txt,dir_sound+name_hash+"/"+str(txt_idx)+".mp3")
|
|
|
+ if lang==1:
|
|
|
+ tts = gTTS(txt)
|
|
|
+ tts.save(dir_sound+name_hash+"/"+str(txt_idx)+".mp3")
|
|
|
+ else:
|
|
|
+ tts = zhtts.TTS()
|
|
|
+ tts.text2wav(txt,dir_sound+name_hash+"/"+str(txt_idx)+".mp3")
|
|
|
txt_idx+=1
|
|
|
print("mp3 file made")
|
|
|
#make title as image
|
|
@@ -176,6 +157,7 @@ def txt2image(content, save_target):
|
|
|
text= unicode_text
|
|
|
draw.text((5,5), text, (255, 255, 0), font)
|
|
|
canvas.save(save_target, "PNG")
|
|
|
+
|
|
|
def txt2image_title(content, save_target):
|
|
|
unicode_text = trim_punctuation(content)
|
|
|
font = ImageFont.truetype(font="font/DFT_B7.ttc", size=28)
|
|
@@ -253,12 +235,20 @@ def generate_subtitle_image(name_hash,text_content):
|
|
|
img_list[idx]+=[{"count":len(sub),"path":sv_path}]
|
|
|
return img_list
|
|
|
|
|
|
+def generate_subtitle_image_ENG(name_hash,text_content):
|
|
|
+ img_list = [None]*len(text_content)
|
|
|
+ for idx in range(len(text_content)):
|
|
|
+ img_list[idx]=[]
|
|
|
+ sv_path = dir_subtitle + name_hash +'/'+str(idx)+ str(inner_idx) +'.png'
|
|
|
+ sub = text_content[idx]
|
|
|
+ txt2image(sub, sv_path)
|
|
|
+ img_list[idx] = sub
|
|
|
+ return img_list
|
|
|
|
|
|
-
|
|
|
-def anchor_video_v2(name_hash,name,text_content, image_urls,avatar,client_id):
|
|
|
+def anchor_video_v2(name_hash,name,text_content, image_urls,avatar):
|
|
|
print(os.getcwd())
|
|
|
print('sub image made')
|
|
|
- file_prepare_v2(name, name_hash, text_content,image_urls)
|
|
|
+ file_prepare(name, name_hash, text_content,image_urls,0)
|
|
|
sub_list=generate_subtitle_image(name_hash,text_content)
|
|
|
|
|
|
for fname in range(len(text_content)):
|
|
@@ -398,12 +388,152 @@ def anchor_video_v2(name_hash,name,text_content, image_urls,avatar,client_id):
|
|
|
w.Close()
|
|
|
print("video at : www.choozmo.com:8168/"+video_sub_folder+name_hash+".mp4")
|
|
|
|
|
|
+
|
|
|
+def anchor_video_ENG(name_hash,name,text_content, image_urls,sub_titles,avatar):
|
|
|
+ file_prepare(name, name_hash, text_content,image_urls,1)
|
|
|
+ sub_list=generate_subtitle_image_ENG(name_hash,sub_titles)
|
|
|
+
|
|
|
+ for fname in range(len(text_content)):
|
|
|
+ call_anchor(name_hash+"/"+str(fname),avatar)
|
|
|
+ print('step finish')
|
|
|
+ print('called............................................')
|
|
|
+
|
|
|
+ ck=cKey(0,254,0,270)
|
|
|
+ ck_anchor=cKey(0,255,1,320)
|
|
|
+ duration = 0
|
|
|
+ #average layer level is 3
|
|
|
+ t = openshot.Timeline(1280, 720, openshot.Fraction(30000, 1000), 44100, 2, openshot.LAYOUT_STEREO)
|
|
|
+ t.Open()
|
|
|
+
|
|
|
+ main_timer = 0
|
|
|
+ #add logo
|
|
|
+ LOGO_OP = openshot.FFmpegReader(dir_video+"LOGO_OP.mp4")
|
|
|
+ LOGO_OP.Open() # Open the reader
|
|
|
+ LOGO_OP_clip = video_photo_clip(vid=LOGO_OP,layer=4,position=0,end=LOGO_OP.info.duration
|
|
|
+ ,location_y=-0.03,scale_x=0.8,scale_y=0.704)
|
|
|
+ t.AddClip(LOGO_OP_clip)
|
|
|
+ #add background video (head is different)
|
|
|
+ bg_head = openshot.FFmpegReader(dir_video+"bg_head.avi")
|
|
|
+ bg_head.Open()
|
|
|
+ bg_head_clip = video_photo_clip(vid=bg_head,layer=2,position=0,end=LOGO_OP.info.duration,ck=ck)
|
|
|
+ t.AddClip(bg_head_clip)
|
|
|
+
|
|
|
+ main_timer += LOGO_OP.info.duration
|
|
|
+ head_duration = LOGO_OP.info.duration
|
|
|
+ bg_head.Close()
|
|
|
+ LOGO_OP.Close()
|
|
|
+
|
|
|
+ #prepare empty list
|
|
|
+ clip_duration=0
|
|
|
+ photo_clip_list = [None]*len(text_content)
|
|
|
+ img_list = [None]*len(text_content)
|
|
|
+ anchor_clip_list = [None] * len(text_content)
|
|
|
+ anchor_list = [None] * len(text_content)
|
|
|
+ audio_clip_list = [None] * len(text_content)
|
|
|
+ audio_list = [None] * len(text_content)
|
|
|
+ sub_clip_list = [None] * len(text_content)
|
|
|
+ #openshot image holder
|
|
|
+ sub_img_list = [None] * len(text_content)
|
|
|
+
|
|
|
+ idx = 0
|
|
|
+ for p in listdir(dir_photo+name_hash):
|
|
|
+
|
|
|
+ anchor_list[idx] = openshot.FFmpegReader(dir_anchor+name_hash+"/"+str(idx)+".mp4")
|
|
|
+ clip_duration = anchor_list[idx].info.duration
|
|
|
+ anchor_list[idx].Open()
|
|
|
+ anchor_clip_list[idx] = video_photo_clip(vid=anchor_list[idx],layer=4,scale_x=0.65,scale_y=0.65,
|
|
|
+ location_x=0.35,location_y=0.25,position=main_timer, end=clip_duration,ck=ck_anchor,audio=False)
|
|
|
+ t.AddClip(anchor_clip_list[idx])
|
|
|
+ #insert image
|
|
|
+ img_list[idx] = openshot.FFmpegReader(dir_photo+name_hash+'/'+p)
|
|
|
+ img_list[idx].Open()
|
|
|
+ photo_clip_list[idx] = video_photo_clip(vid=img_list[idx],layer=3
|
|
|
+ ,scale_x=0.81,scale_y=0.68,location_y=-0.03,position=main_timer,end=clip_duration,audio=False)
|
|
|
+ t.AddClip(photo_clip_list[idx])
|
|
|
+ img_list[idx].Close()
|
|
|
+ #insert audio (speech)
|
|
|
+ audio_list[idx] = openshot.FFmpegReader(dir_sound+name_hash+"/"+str(idx)+".mp3")
|
|
|
+ audio_list[idx].Open()
|
|
|
+ audio_clip_list[idx] = openshot.Clip(audio_list[idx])
|
|
|
+ audio_clip_list[idx].Position(main_timer)
|
|
|
+ audio_clip_list[idx].End(clip_duration)
|
|
|
+ t.AddClip(audio_clip_list[idx])
|
|
|
+ #insert subtitle
|
|
|
+ sub_img_list[idx] = openshot.QtImageReader(sub_list[idx])
|
|
|
+ sub_img_list[idx].Open()
|
|
|
+ sub_clip_list[idx] = video_photo_clip(vid=sub_img_list[idx], layer=6,location_x=0.069, location_y=0.89,position=main_timer,end=clip_duration)
|
|
|
+ t.AddClip(sub_clip_list[idx])
|
|
|
+
|
|
|
+ img_list[idx].Close()
|
|
|
+ anchor_list[idx].Close()
|
|
|
+ audio_list[idx].Close()
|
|
|
+ sub_img_list[idx].Close()
|
|
|
+
|
|
|
+ main_timer += clip_duration
|
|
|
+ idx+=1
|
|
|
+
|
|
|
+ LOGO_ED = openshot.FFmpegReader(dir_video+"LOGO_ED.avi")
|
|
|
+ LOGO_ED.Open()
|
|
|
+ LOGO_ED_clip = video_photo_clip(vid=LOGO_ED,layer=4,position=main_timer,end=LOGO_ED.info.duration+2
|
|
|
+ ,location_x=0.005,location_y=-0.031
|
|
|
+ ,scale_x=0.8,scale_y=0.6825)
|
|
|
+ t.AddClip(LOGO_ED_clip)
|
|
|
+ ED_duration = LOGO_ED.info.duration
|
|
|
+ LOGO_ED.Close()
|
|
|
+
|
|
|
+
|
|
|
+ bg = openshot.FFmpegReader(dir_video+"bg.mp4")
|
|
|
+ bg.Open()
|
|
|
+ bg_times = math.floor(main_timer+ED_duration/bg.info.duration)
|
|
|
+ left_time = (main_timer+ED_duration) % bg.info.duration
|
|
|
+ bg_clip_list = [None] * bg_times
|
|
|
+ bg_list = [None] * bg_times
|
|
|
+ bg.Close()
|
|
|
+ bg_timer = head_duration
|
|
|
+ for idx in range(bg_times):
|
|
|
+ bg_list[idx] = openshot.FFmpegReader(dir_video+"bg.mp4")
|
|
|
+ bg_list[idx].Open()
|
|
|
+ bg_clip_list[idx] = video_photo_clip(bg_list[idx],layer=2,position=bg_timer
|
|
|
+ ,end=bg_list[idx].info.duration,ck=ck)
|
|
|
+ t.AddClip(bg_clip_list[idx])
|
|
|
+ bg_timer += bg_list[idx].info.duration
|
|
|
+ bg_list[idx].Close()
|
|
|
+ bg_left = openshot.FFmpegReader(dir_video+"bg.mp4")
|
|
|
+ bg_left.Open()
|
|
|
+ bg_left_clip = video_photo_clip(bg_left,layer=2,position=bg_timer,end=left_time,ck=ck)
|
|
|
+ t.AddClip(bg_left_clip)
|
|
|
+ bg_left.Close()
|
|
|
+
|
|
|
+ title = openshot.QtImageReader(dir_title+name_hash+".png")
|
|
|
+ title.Open() # Open the reader
|
|
|
+ title_clip = video_photo_clip(vid=title, layer=4,location_x=-0.047, location_y=0.801,position=0,end=head_duration+main_timer)
|
|
|
+ t.AddClip(title_clip)
|
|
|
+
|
|
|
+ ####start building
|
|
|
+ w = openshot.FFmpegWriter(tmp_video_dir+name_hash+".mp4")
|
|
|
+ w.SetAudioOptions(True, "aac", 44100, 2, openshot.LAYOUT_STEREO, 3000000)
|
|
|
+ w.SetVideoOptions(True, "libx264", openshot.Fraction(30000, 1000), 1280, 720,
|
|
|
+ openshot.Fraction(1, 1), False, False, 3000000)
|
|
|
+ w.Open()
|
|
|
+
|
|
|
+ #may change duration into t.info.duration
|
|
|
+ frames = int(t.info.fps)*int(head_duration+main_timer+ED_duration)
|
|
|
+ for n in range(frames):
|
|
|
+ f=t.GetFrame(n)
|
|
|
+ w.WriteFrame(f)
|
|
|
+
|
|
|
+ notify_group(name+"(ENG)的影片已經產生完成囉! www.choozmo.com:8168/"+video_sub_folder+name_hash+".mp4")
|
|
|
+ t.Close()
|
|
|
+ w.Close()
|
|
|
+ print("video at : www.choozmo.com:8168/"+video_sub_folder+name_hash+".mp4")
|
|
|
#line notifs
|
|
|
|
|
|
|
|
|
class video_service(rpyc.Service):
|
|
|
- def exposed_call_video(self,name_hash,name,text_content, image_urls,avatar,client_id):
|
|
|
- anchor_video_v2(name_hash,name,text_content, image_urls,avatar,client_id)
|
|
|
+ def exposed_call_video(self,name_hash,name,text_content, image_urls,avatar):
|
|
|
+ anchor_video_v2(name_hash,name,text_content, image_urls,avatar)
|
|
|
+ def exposed_call_video_eng(self,name_hash,name,text_content, image_urls,sub_titles,avatar):
|
|
|
+ anchor_video_eng(name_hash,name,text_content, image_urls,sub_titles,avatar)
|
|
|
|
|
|
|
|
|
|