import numpy as np import subprocess import cv2 # with subprocess and an extra argument 'scene' and a 'resized image saved as png' we can call the server # yt-dlp is instaled in .d4 # Download Part of Video # yt-dlp https://www.youtube.com/watch?v=UZ9uyQI3pF0 --downloader ffmpeg --downloader-args "ffmpeg_i:-ss 997 -to 2512" # ffmpeg -i Sandra\ Kotevska\,\ Painting\ Rose\ bush\,\ mixed\ media\,\ 2017.\ \[NMzC_036MtE\].mkv -f mp3 -ar 22050 -vn out44.wav -ac 1 # https://superuser.com/questions/583393/how-to-extract-subtitle-from-video-using-ffmpeg def _shift(x): n = x.shape[0] i = np.random.randint(.24 * n, .74 * n) return np.roll(x, i) #___________________________________________________________________________________________________ # VIDEO FROM IMAGE with CAPTIONS # # UPLOAD to: Simaviro: Documents General WORK PACKAGES WP1 ContentRepository ANBPR_ROMANIA TTSvideos # __________________________________________________________________________________________________ # TO DONLOAD SRT for youtub # yt-dlp --write-sub --sub-lang en --convert-subs "srt" https://www.youtube.com/watch?v=F1Ib7TAu7eg&list=PL4x2B6LSwFewdDvRnUTpBM7jkmpwouhPv&index=2 # _voice = 'en_US/vctk_low#p330' # _voice = 'en_US/cmu-arctic_low#lnh' #en_US/vctk_low#p249' # 'en_US/vctk_low#p282' # _voice = ''en_US/vctk_low#p351'' # _voice = 'en_US/vctk_low#p351' # avoid 318 it does the ghhhhhh # _voice = 'en_US/m-ailabs_low#judy_bieber' # Nice voice for ('Arta culinara romaneasca - Groza Irina [phIF0NxgwlQ].mkv' 'Arta culinara romaneasca - Groza Irina [phIF0NxgwlQ].en-GB.srt'), # _voice = 'en_UK/apope_low' # _voice = 'en_US/m-ailabs_low#mary_ann' # _voice = 'en_US/vctk_low#p351' # _voice = 'en_US/hifi-tts_low#92' # voice_str = f'_{_voice.replace("/", "")}' # image/descriptions provided by other SHIFT tool or Human curator # https://simaviro.sharepoint.com/sites/SHIFT/Shared%20Documents/Forms/AllItems.aspx?csf=1&web=1&e=JNK8dQ&cid=363c253d%2D4d61%2D4db1%2D8ffd%2Ddedda749da2d&RootFolder=%2Fsites%2FSHIFT%2FShared%20Documents%2FGENERAL%2FWORK%20PACKAGES%2FWP1%2FContent%20Repository%2Fshift%5FSPK%5Fuse%5Fcases%5Fshare%2F02%5Fuc%5Fspk%5FLandscape2Soundscape%2FLandscape2Soundscape%5F12%5FMasterpieces&FolderCTID=0x01200058F5037C0101524B82F6F0788C02A563 # STATIC_FRAME = 'uc_spk_Landscape2Soundscape_Masterpieces_pics/01_Schick_AII840_001.jpg' #'assets/image_from_T31.jpg' PIC_DIR = 'uc_spk_Landscape2Soundscape_Masterpieces_pics/' DESCRIPTIONS = [ # 1 [ '01_Schick_AII840_001.jpg', # image '01_Schick_AII840_001.txt', # text 'Statue in shire hill on autumn beach.', # audiocraft 'Gottlieb Schick - Bildnis der Heinrike Dannecker - 1802', # cv2 puttext title 'en_US/m-ailabs_low#mary_ann', ], # 2 [ '02_Constable_AI555_001.jpg', '02_Constable_AI555_001.txt', 'Meadows country farm village in sight', 'John Constable - Dorf an dem Flusse Stour - 1804', 'en_US/m-ailabs_low#mary_ann', ], # 3 [ '03_Schinkel_WS200-002.jpg', '03_Schinkel_WS200-002.txt', 'Arriving at the shore on horses', 'Karl Friedrich Schinkel - Gotische Kirche auf einem Felsen am Meer - 1815', 'en_US/m-ailabs_low#mary_ann', ], # [ '04_Friedrich_FV317_001.jpg', '04_Friedrich_FV317_001.txt', 'Land steppes', 'Friedrich Caspar David - Der Watzmann - 1824/1825', 'en_US/m-ailabs_low#mary_ann', ], # [ '05_Blechen_FV40_001.jpg', '05_Blechen_FV40_001.txt', 'fjords', 'Blechen - Carl Unwetter in der römischen Campagna - 1829', 'en_US/m-ailabs_low#mary_ann', ], # 6 [ '06_Menzel_AI900_001.jpg' '06_Menzel_AI900_001.txt', 'Olive trees in Seville', 'Adolph Menzel - Bauplatz mit Weiden - 1846', 'en_US/m-ailabs_low#mary_ann', ], # 7 [ '07_Courbet_AI967_001.jpg', '07_Courbet_AI967_001.txt', 'Storm at the strand of waves Tsunami', 'Gustave Courbet - Die Welle - 1869/1870', 'en_US/m-ailabs_low#mary_ann', ], # 8 [ '08_Monet_AI1013_001.jpg', '08_Monet_AI1013_001.txt', 'Mai flowers blossom picnic', 'Claude Monet - Sommertag - 1874', 'en_US/m-ailabs_low#mary_ann', ], # 9 [ '09_Blechen_AII823_001.jpg', '09_Blechen_AII823_001.txt', 'Cascade in Africa', 'Carl Blechen - Wasserfälle bei Tivoli - 1832', 'en_US/m-ailabs_low#mary_ann', ], # 10 [ '10_Boecklin_967648_NG2-80_001_rsz.jpg', '10_Boecklin_967648_NG2-80_001.txt', 'Hades ades at it sisland', 'Arnold Böcklin - Toteninsel - 1883', 'en_US/m-ailabs_low#mary_ann', ], # 11 [ '11_Liebermann_NG4-94_001.jpg', '11_Liebermann_NG4-94_001.txt', 'Tavern at the waterfront', 'Max Tiebermann - Gartenlokal an der Havel. Nikolskoe - 1916', 'en_US/m-ailabs_low#mary_ann', ], # 12 [ '12_Slevogt_AII1022_001.jpg', '12_Slevogt_AII1022_001.txt', 'toy sailing yachts pool', 'Max Slevogt - Segelboote auf der Alster am Abend -1905', 'en_US/m-ailabs_low#mary_ann', ], ] SILENT_VIDEO = '_silent_video.mp4' # SILENT CLIP for _img_, _text_, soundscape_text, _title_, _voice_ in DESCRIPTIONS[:20]: # cv2put txt im = cv2.imread(PIC_DIR + _img_) # IMG must have EVEN shape h, w, _ = im.shape im = im[(h%2):, (w%2):, :] # assure even image print(im.shape, "GLOBAL IM\n\n\n\n") fram = np.zeros((94, im.shape[1], 3), dtype=np.uint8) h, w, _ = fram.shape font = cv2.FONT_HERSHEY_SIMPLEX bottomLeftCornerOfText = (240, 74) # w,h fontScale = 2 fontColor = (255, 255, 255) thickness = 4 lineType = 2 cv2.putText(fram, _title_, #'LandScape 2 SoundScape', bottomLeftCornerOfText, font, fontScale, fontColor, thickness, lineType) offset_h = 24 im[offset_h:h+offset_h, :w, :] = (.4 * im[offset_h:h+offset_h, :w, :] + .6 * fram).astype(np.uint8) # cv2.imshow('i', im); cv2.waitKey(); cv2.destroyAllWindows() # logo aud logo = cv2.imread('assets/audeering_logo.jpg')[:740, :, :] logo = cv2.resize(logo, (logo.shape[1]//2, logo.shape[0]//2)) h, w, _ = logo.shape offset_h = im.shape[0] - h im[offset_h:h+offset_h, :w, :] = (.23 * im[offset_h:h+offset_h, :w, :] + .77 * logo).astype(np.uint8) # logo SMB logo = cv2.imread('assets/SMB_logo.png')#[:740, :, :] logo = cv2.resize(logo, (logo.shape[1]//2, logo.shape[0]//2)) h, w, _ = logo.shape offset_h = im.shape[0] - h # fill logo SMB with the pixels of im - where SMB is empty ptc = im[offset_h:h+offset_h, :w, :] logo[logo == 0] = ptc[logo == 0] # fill empty im[offset_h:h+offset_h, :w, :] = (.13 * im[offset_h:h+offset_h, :w, :] + .86 * logo).astype(np.uint8) # # logo shift # logo = cv2.imread('assets/shift_logo.png')#[:740, :, :] # logo = cv2.resize(logo, (logo.shape[1]//2, logo.shape[0]//2)) # h, w, _ = logo.shape # offset_h = im.shape[0] - h #-274 # offset_w = im.shape[1] - w #400 # # # fill logo SMB with the pixels of im - where SMB is empty # ptc = im[offset_h:h+offset_h, :w, :] # # msk = np.tile(logo[:, :,0:1] > 252, [1,1,3]) # # logo[msk] = ptc[msk] # fill empty # im[offset_h:h+offset_h, offset_w:w+offset_w, :] = (.0 * im[offset_h:h+offset_h, offset_w:w+offset_w, :] + 1 * logo).astype(np.uint8) # silent video - img # im = cv2.resize(im, (700, 700)) cv2.imwrite('pic_logo_emb.png', im) # raw, _ = soundfile.read(soundscape_file) # 12345, 2 # # fill # soundscape = [] # for _replica in range(math.ceil(len(total) / raw.shape[0])+1): # soundscape.append(raw) # _shift non defined for stereo # soundscape = np.concatenate(soundscape, 0) # total = .36 * np.concatenate([total[:, None], # total[:, None]], 1) + .64 * soundscape[:len(total), :] # outfile OUT_FILE = _img_.split('/')[-1].replace('.','__') + '.mp4' # assets / -1 print(f'{OUT_FILE=}\n') # call API passing img subprocess.run( [ "python", "tts.py", "--text", PIC_DIR + _text_, '--image', 'pic_logo_emb.png', # "--title", _title_, # '--soundscape_text', soundscape_text, '--voice', _voice_, '--out_file', OUT_FILE, ]) # soundfile.write(AUDIO_TRACK, total, 22050) # subprocess.call( # ["ffmpeg", # "-y", # "-i", # SILENT_VIDEO, # "-i", # AUDIO_TRACK, # #"-c:v", # #"copy", # "-map", # "0:v:0", # "-map", # " 1:a:0", # "-vf", # "pad", # OUT_FILE])