from Main import wav2art import numpy as np import librosa import base64 import gc gc.enable() import os import matplotlib.pyplot as plt import soundfile as sf from cv2 import resize, INTER_LINEAR from PIL import Image import scipy.signal as signal from matplotlib.animation import FuncAnimation, FFMpegWriter import torch import librosa import streamlit as st from PIL import Image import streamlit as st dir_path = os.path.dirname(os.path.realpath(__file__)) im = Image.open(dir_path + "/Logo.png") st.set_page_config( page_title="Watch Me Talk", page_icon=im, ) st.markdown( """ """, unsafe_allow_html=True ) st.markdown( f"""

Watch Me Speak

""", unsafe_allow_html=True ) # st.markdown('# Watch Me Talk') hline = ''' --- ''' what = st.radio( "Select an option:", ('See examples', 'Upload audio file')) st.markdown(hline) if what == 'See examples': example = st.radio( "Select a sample sentence:", ( "1. Be careful not to plow over the flower beds.", "2. Project development was proceeding too slowly.", "3. This brochure is particularly informative for a prospective buyer.", "4. I'd rather not buy these shoes than be overcharged.", "5. Those musicians harmonize marvellously." ) ) if example is not None: example_ind = example[0] example_path = str(example_ind) + '.mp4' video_file = open(example_path, 'rb') video_bytes = video_file.read() st.video(video_bytes) if what == 'Upload audio file': uploaded_file = st.file_uploader("Choose a .wav file", type=["wav"]) if uploaded_file is not None: wav_np, sr = librosa.load(uploaded_file, sr = 16000) sf.write('audio.wav', wav_np, sr, subtype='PCM_24') wav = wav_np.tolist() emaTemp2 = wav2art(wav_np) my_bar = st.progress(0) TA = st.empty() text = TA.text_area("", "Firing up!") C_AH = np.array([0.16793381, 0.61851003, 0.3930835 , 2.73506039, 0.84535045, 1.04448936, 1.5337297 , 1.37088293, 1.52812757, 1.00774768, 1.84668592, 1.06159204]) meanOfData_AH = np.array([ 10.18237309, 6.88706306, 11.9609807 , -4.72927955, -0.77401723, -44.12270889, -13.25678639, -0.96288923, -23.19792409, 3.77430628, -31.07672544, 7.20676208]) meanOfData = np.mean(emaTemp2,axis=0) emaTemp2 -= meanOfData C = 0.5*np.sqrt(np.mean(np.square(emaTemp2),axis=0)) ema = np.divide(emaTemp2,C) ema = ema*C_AH + meanOfData_AH emaR_sub = np.reshape(ema, (len(ema), 6, 2)) my_bar.progress(10) text = TA.text_area("", "Loading wav2vec 2.0 ...") model = torch.load("model.pt") tokenizer = torch.load('tokenizer.pt') feature_extractor = torch.load('feature_extractor.pt') my_bar.progress(15) text = TA.text_area("", "Estimating phonemes ...") input_values = feature_extractor(wav, return_tensors="pt", sampling_rate = sr).input_values logits = model(input_values).logits[0] pred_ids = torch.argmax(logits, axis=-1) # retrieve word stamps (analogous commands for `output_char_offsets`) outputs = tokenizer.decode(pred_ids, output_char_offsets = True) time_offset = model.config.inputs_to_logits_ratio phoneme_dict = {'m' : 0, 'ɱ' : 0, 'n' : 0, 'ŋ' : 0, 'ɴ' : 0} char_offsets = [ { "char": d["char"], "start_time": round(d["start_offset"] * time_offset, 2), "end_time": round(d["end_offset"] * time_offset, 2), "nasality": phoneme_dict.get(d["char"], 1) } for d in outputs.char_offsets ] initial = char_offsets[0]['start_time'] final = len(wav) - char_offsets[-1]['end_time'] phonemes = [] toprint = [] for p in range(initial): phonemes.append(0) toprint.append('') prev_phon = 0 prev_tp = '' for p in char_offsets: for t in range(int(np.floor((p['start_time'] - final)/2))): phonemes.append(prev_phon) toprint.append(prev_tp) for t in range(int(np.ceil((p['start_time'] - final)/2))): phonemes.append(p['nasality']) toprint.append(p['char']) final = p['end_time'] for t in range(p['end_time'] - p['start_time']): phonemes.append(p['nasality']) toprint.append(p['char']) prev_phon = p['nasality'] prev_tp = p['char'] final = len(wav) - char_offsets[-1]['end_time'] for p in range(final): phonemes.append(0) toprint.append('') length = int(len(emaR_sub) * 0.3) ema = signal.resample(emaR_sub, length) my_bar.progress(25) processed = [] to_print = [] for d in range(0, len(phonemes), 160): begin = (d - 160 > 0) * (d - 160 ) phones20 = phonemes[begin : d + 160] phone = max(set(phones20), key=phones20.count) processed.append(phone) phones20 = toprint[begin : d + 160] phone = max(set(phones20), key=phones20.count) to_print.append(phone) res = resize(np.array(processed).astype('float32'), dsize=(1, length), interpolation = INTER_LINEAR) processed2 = res.flatten() final_print = [] i = 0 while i < len(to_print): z = int(3 + i % 3) phones20 = to_print[i : i + z] phone = max(set(phones20), key=phones20.count) final_print.append(phone) i += z gaps = np.abs(len(processed2) - len(final_print)) total_len = len(final_print) for i, j in enumerate(np.linspace(0, total_len - 1, gaps)): del_index = int(j - i - 1) del final_print[del_index] kernel = [1/10 for i in range(10)] processed3 = np.convolve(processed2, kernel) ### below code is to find the average distance between certain ema points in a dataset so that we can define our offsets for ### the bezier curve contours accordingly later on def find_off(matrix): p = 0 q = 0 for i in range(len(matrix)): q += matrix[i][0][1] - matrix[i][1][1] p += matrix[i][1][0] - matrix[i][2][0] p = p/len(matrix) q = q/len(matrix) return np.round_([p, q]) ### defining offsets for the t_end and the tongue base points so as to make the curves as relative as possible def tongue_off(matrix): c = 0 d = 0 for i in range(len(matrix)): d += matrix[i][3][1] - matrix[i][5][1] c += matrix[i][3][0] - matrix[i][4][0] c = np.abs(c/len(matrix)) d = np.abs(d/len(matrix)) return np.round_([c, d]) k = find_off(ema) l = tongue_off(ema) print(ema[0]) l = l*1.5 global painting from scipy.special import comb def bernstein_poly(i, n, t): return comb(n, i) * ( t**(n-i) ) * (1 - t)**i def bezier_curve(xPoints, yPoints, nTimes=150): nPoints = len(xPoints) t = np.linspace(0.0, 1.0, nTimes) polynomial_array = np.array([bernstein_poly(i, nPoints-1, t) for i in range(0, nPoints)]) xvals = np.dot(xPoints, polynomial_array) yvals = np.dot(yPoints, polynomial_array) return xvals, yvals, nTimes def contract(x): m = np.mean(x) for i in range(len(x)): x[i] = (2*m + 3*x[i]) / 5 return x brain0 = Image.open('BrainAndSpinal.png') text = TA.text_area("", "Rendering frame: 0 of " + str(len(ema))) import time plt.rcParams.update({'font.size': 22}) n = 6 clr = np.arange(6) arr = np.ones((6, 2)) plots = [] particles = np.zeros(n,dtype=[("position", float, 2), ("size", float , 1)]) particles["position"] = ema[0] particles["size"] = 0.5*np.ones(n) n1o = ema[0] ulo = n1o[0] llo = n1o[1] jawo = n1o[2] tto = n1o[3] tbo = n1o[4] tdo = n1o[5] max_tt = np.max(np.abs(ema[:, 3, 0])) fig = plt.figure(figsize = (6, 6)) ax = plt.axes() llj0 = np.array([llo[0], llo[0]+(k[0]*4/13), llo[0]-(k[0]*25/13), jawo[0]+(k[0]*5/13), jawo[0]]) llj1 = np.array([llo[1], llo[1]-(k[1]*12/12), llo[1]-(k[1]*10/12), jawo[1]+(k[1]*5/13), jawo[1]]) nose0 = np.array([tto[0]+(k[0]*14/13), ulo[0]+(k[0]*7/13), ulo[0]+(k[0]*36/13), ulo[0]-(k[0]*10/13), ulo[0]]) nose1 = np.array([ulo[1]+(k[1]*50/12), ulo[1]+(k[1]*35/12), ulo[1]-(k[1]*7/13), ulo[1]+(k[1]*35/12), ulo[1]]) llip0 = np.array([llo[0], llo[0] - .2*(l[0]), llo[0] - .5*(l[0])]) llip1 = np.array([llo[1],llo[1] + .1*(l[1]), llo[1] - .2*(l[1])]) ulip0 = np.array([ulo[0], ulo[0], ulo[0]-(k[0]*5/13), ulo[0]-(k[0]*8/13)]) ulip1 = np.array([ulo[1], ulo[1]-(k[1]*4/12), ulo[1]-(k[1]*4/12), ulo[1]+(k[1]*5/12)]) chin0 = np.array([jawo[0], jawo[0]-(k[0]*5/13), jawo[0]-(k[0]*15/13), 2*tdo[0]- 1*tbo[0]]) chin1 = np.array([jawo[1], jawo[1]-(k[1]*10/13), jawo[1]-(k[1]*2/13), jawo[1]-(k[1]*10/13)]) tongue0 = np.array([tto[0], tdo[0]-(l[0]*8/13), tdo[0]-(l[0]*5/13), tdo[0] - 1.5*l[0], tdo[0] - 1*l[0] - (75/(tto[0] - tdo[0]))]) tongue1 = np.array([tto[1], tdo[1]+(l[1]*7/13), tdo[1]-(l[1]*1/13), jawo[1]+(l[1]*36/13), jawo[1]+(l[1]*8/13)]) tline0 = np.array([jawo[0] - .4*l[0], .5*tbo[0] + .5*tto[0] , tdo[0], tdo[0] - 1*l[0] - (75/(tto[0] - tdo[0]))]) tline1 = np.array([jawo[1]+(l[1]*9/13), jawo[1]+(l[1]*5/13), jawo[1]+(l[1]*5/13), jawo[1]+(l[1]*8/13)]) Xa, Ya, Na = bezier_curve(xPoints = llj0, yPoints = llj1) Xb, Yb, Nb = bezier_curve(xPoints = nose0, yPoints = nose1) Xc, Yc, Nc = bezier_curve(xPoints = tongue0, yPoints = tongue1) Xd, Yd, Nd = bezier_curve(xPoints = llip0, yPoints = llip1) Xe, Ye, Ne = bezier_curve(xPoints = ulip0, yPoints = ulip1) temp1 = int(Ne/5) temp2 = int(Nb/6) # palate0 = np.array([Xe[temp1], Xe[temp1]-(k[0]*4/13), Xe[temp1]-(k[0]*8/13), Xe[temp1]-(k[0]*23/13), Xe[temp1]-(k[0]*32/10)]) # palate1 = np.array([Ye[temp1], Ye[temp1], Ye[temp1]+(k[1]*7/12), Ye[temp1]+(k[1]*20/12), Ye[temp1]+(k[1]*8/12)]) palate0 = np.array([Xe[temp1], Xe[temp1]-(k[0]*4/13), Xe[temp1]-(k[0]*8/13), Xe[temp1]-(k[0]*23/13), Xe[temp1]-(k[0]*32/10)]) palate1 = np.array([Ye[temp1], Ye[temp1], Ye[temp1]+(k[1]*7/12), Ye[temp1]+(k[1]*10/12), Ye[temp1]+(k[1]*8/12)]) # nose_base0 = np.array([Xb[20], Xb[temp2]-(k[0]*3/13) , Xb[temp2]-(k[0]*9/13), Xe[temp1]-(k[0]*32/10), Xe[temp1]-(k[0]*34/10)]) # nose_base1 = np.array([Yb[20], Yb[temp2]-(k[1]*10/12), Yb[temp2]+(k[1]*17/12), Ye[temp1]+(k[1]*15/12), Ye[temp1]+(k[1]*13/12)]) nose_base0 = np.array([Xb[20], Xb[temp2]-(k[0]*3/13) , Xb[temp2]-(k[0]*9/13), Xe[temp1]-(k[0]*32/10), Xe[temp1]-(k[0]*34/10)]) nose_base1 = np.array([Yb[20], Yb[temp2]-(k[1]*10/12), Yb[temp2]+(k[1]*13/12), Ye[temp1]+(k[1]*13/12), Ye[temp1]+(k[1]*13/12)]) xref = Xe[temp1] yref = Ye[temp1] forehead0 = np.array([Xb[Nb-1], Xb[Nb-1]-(k[0]*4/13), Xb[Nb-1]-(k[0]*2/13)]) forehead1 = np.array([Yb[Nb-1], Yb[Nb-1]+(k[1]*6/12), Yb[Nb-1]+(k[1]*11/12)]) nose_bone0 = np.array([Xc[0] - .6*l[0], Xc[0] - .5*l[0], tdo[0] - 1.6*l[0], Xe[temp1]-(k[0]*45/13), tbo[0]-(k[0]*20/13), tto[0]+(k[0]*5/13), tto[0]+(k[0]*6/13), Xb[temp2]+(k[0]*10/13), Xb[40]]) nose_bone1 = np.array([jawo[1], tto[1], Ye[temp1]+(k[1]*30/12),ulo[1]+(k[1]*32/12), ulo[1]+(k[1]*32/12), ulo[1]+(k[1]*65/12), ulo[1]+(k[1]*35/12), Yb[temp2]+(k[1]*15/12), Yb[40]]) xxx0 = tto[0]+(l[0]*5/13) xxx1 = tto[0]-(l[0]*1/13) xxx12 = tto[0]-(l[0]*1/13) xxx2 = tto[0]-(l[0]*1/13) xxx3 = tto[0]-(l[0]*2/13) yyy0 = tto[1]+(l[1]*0/12) yyy1 = tto[1]-(l[1]*15/12) yyy12 = tto[1]-(l[1]*5/12) yyy2 = jawo[1]+(l[1]*32/13) yyy3 = jawo[1]+(l[1]*30/13) tbase0 = np.array([Xc[-5], xxx0, xxx1, xxx12, xxx2, xxx3, jawo[0] - .5*l[0]]) tbase1 = np.array([Yc[-5], yyy0, yyy1, yyy12, yyy2, yyy3, jawo[1]+(l[1]*22/13)]) Xf, Yf, Nf = bezier_curve(palate0, palate1) Xg, Yg, Ng = bezier_curve(chin0, chin1) Xh, Yh, Nh = bezier_curve(tbase0, tbase1) Xi, Yi, Ni = bezier_curve(tline0, tline1) Xj, Yj, Nj = bezier_curve(nose_base0, nose_base1) Xk, Yk, Nk = bezier_curve(nose_bone0, nose_bone1) uv_diff = phonemes[0] * 4 aa0 = Xj[0] aa1 = Xj[0] - (k[0]*7/10) aa2 = Xj[0] - (k[0]*(9 + 2*uv_diff)/10) aa3 = Xj[0] - (k[0]*(6 + uv_diff)/10) aa4 = Xf[0] - (k[0]*5/10) aan = Xf[0] bb0 = Yj[0] bb1 = Yj[0] + (k[1]*(uv_diff/2)/10) bb2 = Yj[0] - (k[1]*(18 - uv_diff/2)/10) bb3 = Yj[0] - (k[1]*(20 - uv_diff/2)/10) bb4 = Yf[0] + (k[1]*(1 + uv_diff/2)/10) bbn = Yf[0] uvula0 = np.array([aa0, aa1, aa2, aa3, aa4, aan]) uvula1 = np.array([bb0, bb1, bb2, bb3, bb4, bbn]) Xl, Yl, Nl = bezier_curve(uvula0, uvula1) xref2 = xref-(k[0]*45/13) yref2 = yref+(k[1]*30/12) head0 = np.array([tto[0]+(k[0]*14/13), tto[0]+(k[0]*5/13), tto[0]+(k[0]*7/13), xref2+(l[0]*50/11), xref2-(l[0]*50/8), xref2-(l[0]*50/6), tdo[0] - (tto[0] - tdo[0])*2.5, (9*xref2)/4]) head1 = np.array([ulo[1]+(k[1]*50/12), ulo[1]+(k[1]*60/12), ulo[1]+(k[1]*70/12), yref2+(l[1]*10), yref2+(l[1]*8), yref2+(l[1]*2), jawo[1]+(l[1]*18/4), jawo[1] - .5*l[1]]) Xn, Yn, Nn = bezier_curve(head0, head1) x1 = ulo[0] - 5*l[0]/6 x2 = ulo[0] - 1*l[0]/6 x4 = ulo[0] - 4*l[0]/6 y1 = ulo[1] + 4*l[1]/4 y2 = ulo[1] - 1*l[1]/4 y4 = ulo[1] - 3*l[1]/4 utooth_front0 = np.array([x1, x2, x4]) utooth_front1 = np.array([y1, y2, y4]) Xq, Yq, Nq = bezier_curve(utooth_front0, utooth_front1) x1 = ulo[0] - 10*l[0]/12 x2 = ulo[0] - 11*l[0]/12 x3 = ulo[0] - 7*l[0]/12 x4 = ulo[0] - 8*l[0]/12 y1 = ulo[1] + 4*l[1]/4 y2 = ulo[1] - 1*l[1]/4 y3 = ulo[1] + 2*l[1]/4 y4 = ulo[1] - 3*l[1]/4 utooth_back0 = np.array([x1, x2, x3, x4]) utooth_back1 = np.array([y1, y2, y3, y4]) Xr, Yr, Nr = bezier_curve(utooth_back0, utooth_back1) xx1 = jawo[0] - .6*l[0] xx2 = jawo[0] - .4*l[0] xx3 = jawo[0] + .3*l[0] xx4 = jawo[0] + .1*l[0] xx5 = jawo[0] - 1.1*l[0] xx6 = jawo[0] - .7*l[0] xx7 = jawo[0] - .6*l[0] yy1 = jawo[1]+(l[1]*30/13) yy2 = jawo[1]+(l[1]*40/13) yy3 = jawo[1]+(l[1]*30/13) yy4 = jawo[1]-(l[1]*3/13) yy5 = jawo[1]-(l[1]*5/13) yy6 = jawo[1]+(l[1]*20/13) yy7 = jawo[1]+(l[1]*30/13) ltooth_base0 = np.array([xx1, xx2, xx3, xx4, xx5, xx6, xx7]) ltooth_base1 = np.array([yy1, yy2, yy3, yy4, yy5, yy6, yy7]) Xs, Ys, Ns = bezier_curve(ltooth_base0, ltooth_base1) x1 = jawo[0] - l[0]*.45 x2 = jawo[0] + l[0]*0.215 x3 = jawo[0] - l[0]*0.215 y1 = jawo[1]+(l[1]*18/13) y2 = jawo[1]+(l[1]*28/13) y3 = jawo[1]+(l[1]*39/13) ltooth_front0 = np.array([x1, x2, x3]) ltooth_front1 = np.array([y1, y2, y3]) Xt, Yt, Nt = bezier_curve(ltooth_front0, ltooth_front1) x1 = jawo[0] - l[0]*.45 x2 = jawo[0] - l[0]*.45 x3 = jawo[0] - l[0]*0.25 x4 = jawo[0] - l[0]*0.215 y1 = jawo[1]+(l[1]*18/13) y2 = jawo[1]+(l[1]*33/13) y3 = jawo[1]+(l[1]*28/13) y4 = jawo[1]+(l[1]*39/13) ltooth_back0 = np.array([x1, x2, x3, x4]) ltooth_back1 = np.array([y1, y2, y3, y4]) Xu, Yu, Nu = bezier_curve(ltooth_back0, ltooth_back1) ccc = 'blue' line1, = ax.plot(Xa, Ya, color = ccc) line2, = ax.plot(Xb, Yb, color = ccc) line3, = ax.plot(Xc, Yc, color = ccc) line4, = ax.plot(Xd, Yd, color = ccc) line5, = ax.plot(Xe, Ye, color = ccc) line6, = ax.plot(Xf, Yf, color = ccc) line7, = ax.plot(Xg, Yg, color = ccc) line8, = ax.plot(Xh, Yh, color = ccc) line9, = ax.plot(Xi, Yi, color = ccc, zorder = 1) line10, = ax.plot(Xj, Yj, color = ccc) line11, = ax.plot(Xk, Yk, color = ccc, zorder = 5) line12, = ax.plot(Xl, Yl, color = ccc) line13, = ax.plot(Xn, Yn, color = ccc, zorder = 5) line14, = ax.plot(Xq, Yq, color = ccc, zorder = 5) line15, = ax.plot(Xr, Yr, color = ccc, zorder = 5) line16, = ax.plot(Xs, Ys, color = ccc, zorder = 3) line17, = ax.plot(Xt, Yt, color = ccc, zorder = 5) line18, = ax.plot(Xu, Yu, color = ccc, zorder = 5) class Args(): def __init__(self): self.painting1 = ax.fill(Xc, Yc, 'pink') self.painting2 = ax.fill(np.concatenate((Xh, Xi)), np.concatenate((Yh, Yi)), 'pink') self.painting3 = ax.fill(Xs, Ys, 'gainsboro', zorder = 3) self.painting4 = ax.fill(np.concatenate((Xq, Xr)), np.concatenate((Yq, Yr)), 'white', zorder = 4) self.painting5 = ax.fill(np.concatenate((Xt, Xu)), np.concatenate((Yt, Yu)), 'white', zorder = 4) # self.painting6 = ax.fill(np.concatenate((Xk, Xn)), np.concatenate((Yk, Yn)), 'white', zorder = 3) # plt.scatter(aa1, bb1) # plt.scatter(aa2, bb2) # plt.scatter(aa3, bb3) # plt.scatter(aa4, bb4) c_text = ax.text(-55, 120, '', alpha = 1) args = Args() newax = fig.add_axes([.025, .20, .63, .63], anchor='NE', zorder = 7) newax.imshow(brain0) newax.axis('off') ax.axis('off') my_bar.progress(30) old_phon = '' def remove_all(xx): for x in xx: x.remove() def update_st(f): loaded = int(30 + (54 * f) / len(ema)) my_bar.progress(loaded) text = TA.text_area("", "Rendering frame: " + str(f) + " of " + str(len(ema)), key = f + time.time()) def animate(frame_number): #plt.clf() global temp, old_phon, my_bar update_st(frame_number) particles["position"] = ema[frame_number] n1 = ema[frame_number] phon = processed3[frame_number] if old_phon != final_print[frame_number]: c_text.set_text(final_print[frame_number]) old_phon = final_print[frame_number] # if frame_number > 1: # text1.set_text(final_print[frame_number-2]) # text2.set_text(final_print[frame_number-1]) # text3.set_text(final_print[frame_number]) # if frame_number < len(final_print) - 2: # text4.set_text(final_print[frame_number + 1]) # text5.set_text(final_print[frame_number + 2]) remove_all(args.painting1) remove_all(args.painting2) remove_all(args.painting3) # remove_all(args.painting4) remove_all(args.painting5) ul = n1[0] ll = n1[1] jaw = n1[2] tt = n1[3] tb = n1[4] td = n1[5] # scatter.set_offsets(particles["position"]) llj_x = np.array([ll[0], ll[0]+(k[0]*4/13), ll[0]-(k[0]*25/13), jaw[0]+(k[0]*5/13), jaw[0]]) llj_y = np.array([ll[1], ll[1]-(k[1]*12/12), ll[1]-(k[1]*10/12), jaw[1]+(k[1]*5/13), jaw[1]]) nose_x = np.array([tto[0]+(k[0]*14/13), ulo[0]+(k[0]*5/13), ulo[0]+(k[0]*36/13), ulo[0]-(k[0]*10/13), ul[0]]) nose_y = np.array([ulo[1]+(k[1]*50/12), ulo[1]+(k[1]*35/12), ulo[1]-(k[1]*7/13), ulo[1]+(k[1]*35/12), ul[1]]) tongue_x = np.array([tt[0], td[0]-(l[0]*8/13), td[0]-(l[0]*5/13), td[0] - 1.5*l[0], tdo[0] - 1*l[0] - (75/(tto[0] - tdo[0]))]) tongue_y = np.array([tt[1], td[1]+(l[1]*7/13), td[1]-(l[1]*1/13), jaw[1]+(l[1]*36/13), jaw[1]+(l[1]*8/13)]) llip_x = np.array([ll[0], ll[0] - .2*(l[0]), ll[0] - .5*(l[0])]) llip_y = np.array([ll[1], ll[1] + .1*(l[1]), ll[1] - .2*(l[1])]) ulip_x = np.array([ul[0], ul[0], ul[0]-(k[0]*5/13), Xe[temp1]]) ulip_y = np.array([ul[1], ul[1]-(k[1]*4/12), ul[1]-(k[1]*4/12), Ye[temp1]]) chin_x = np.array([jaw[0], jaw[0]-(k[0]*5/13), jaw[0]-(k[0]*15/13), 2*tdo[0] - 1*tbo[0]]) chin_y = np.array([jaw[1], jaw[1]-(k[1]*10/13), jaw[1]-(k[1]*2/13), jaw[1]-(k[1]*10/13)]) tline_x = np.array([jaw[0] - .4*l[0], .5*tb[0] + .5*tt[0] , tdo[0], tdo[0] - 1*l[0] - (75/(tto[0] - tdo[0]))]) tline_y = np.array([jaw[1]+(l[1]*9/13), jaw[1]+(l[1]*5/13), jaw[1]+(l[1]*5/13), jaw[1]+(l[1]*8/13)]) X1, Y1, N1 = bezier_curve(xPoints = llj_x, yPoints = llj_y) X2, Y2, N2 = bezier_curve(xPoints = nose_x, yPoints = nose_y) X3, Y3, N3 = bezier_curve(xPoints = tongue_x, yPoints = tongue_y) X4, Y4, N4 = bezier_curve(xPoints = llip_x, yPoints = llip_y) X5, Y5, N5 = bezier_curve(xPoints = ulip_x, yPoints = ulip_y) for i in range(N5): if Y5[i] == Ye[int(N5/5)]: temp = i # palate_x = np.array([Xe[temp1], Xe[temp1]-(k[0]*4/13), Xe[temp1]-(k[0]*8/13), Xe[temp1]-(k[0]*23/13), Xe[temp1]-(k[0]*32/10)]) # palate_y = np.array([Ye[temp1], Ye[temp1], Ye[temp1]+(k[1]*7/12), Ye[temp1]+(k[1]*10/12), Ye[temp1]+(k[1]*8/12)]) nose_base_x = np.array([X2[20], Xb[temp2]-(k[0]*3/13) , Xb[temp2]-(k[0]*9/13), Xe[temp1]-(k[0]*32/10), Xe[temp1]-(k[0]*34/10)]) nose_base_y = np.array([Y2[20], Yb[temp2]-(k[1]*10/12), Yb[temp2]+(k[1]*13/12), Ye[temp1]+(k[1]*13/12), Ye[temp1]+(k[1]*13/12)]) xref = Xe[temp1] yref = Ye[temp1] nose_bone_x = np.array([Xc[0] - .6*l[0], Xc[0] - .5*l[0], tdo[0] - 1.6*l[0], Xe[temp1]-(k[0]*45/13), tbo[0]-(k[0]*20/13), tto[0]+(k[0]*5/13), tto[0]+(k[0]*6/13), X2[temp2]+(k[0]*10/13), Xb[40]]) nose_bone_y = np.array([jawo[1], tto[1], Ye[temp1]+(k[1]*30/12),ulo[1]+(k[1]*32/12), ulo[1]+(k[1]*32/12), ulo[1]+(k[1]*65/12), ulo[1]+(k[1]*35/12), Yb[temp2]+(k[1]*15/12), Y2[40]]) xxx0 = tt[0]+(l[0]*5/13) xxx1 = tt[0]-(l[0]*1/13) xxx12 =tt[0]-(l[0]*1/13) xxx2 = tt[0]-(l[0]*1/13) xxx3 = tt[0]-(l[0]*2/13) yyy0 = tt[1]+(l[1]*0/12) yyy1 = tt[1]-(l[1]*15/12) yyy12 = tt[1]-(l[1]*5/12) yyy2 = jaw[1]+(l[1]*32/13) yyy3 = jaw[1]+(l[1]*30/13) tbase_x = np.array([X3[-5], xxx0, xxx1, xxx12, xxx2, xxx3, jaw[0] - .5*l[0]]) tbase_y = np.array([Y3[-5], yyy0, yyy1, yyy12, yyy2, yyy3, jaw[1]+(l[1]*22/13)]) # X6, Y6, N6 = bezier_curve(xPoints = palate_x, yPoints = palate_y) X7, Y7, N7 = bezier_curve(chin_x, chin_y) X8, Y8, N8 = bezier_curve(tline_x, tline_y) X9, Y9, N9 = bezier_curve(tbase_x, tbase_y) X10, Y10, N10 = bezier_curve(nose_base_x, nose_base_y) X11, Y11, N11 = bezier_curve(nose_bone_x, nose_bone_y) uv_diff = phon * 4 aa0 = Xj[0] aa1 = Xj[0] - (k[0]*7/10) aa2 = Xj[0] - (k[0]*(9 + 2*uv_diff)/10) aa3 = Xj[0] - (k[0]*(6 + uv_diff)/10) aa4 = Xf[0] - (k[0]*5/10) aan = Xf[0] bb0 = Yj[0] bb1 = Yj[0] + (k[1]*(uv_diff/2)/10) bb2 = Yj[0] - (k[1]*(18 - uv_diff/2)/10) bb3 = Yj[0] - (k[1]*(20 - uv_diff/2)/10) bb4 = Yf[0] + (k[1]*(1 + uv_diff/2)/10) bbn = Yf[0] uvula_x = np.array([aa0, aa1, aa2, aa3, aa4, aan]) uvula_y = np.array([bb0, bb1, bb2, bb3, bb4, bbn]) X12, Y12, N12 = bezier_curve(uvula_x, uvula_y) xref2 = xref-(k[0]*45/13) yref2 = yref+(k[1]*30/12) head_x = np.array([tto[0]+(k[0]*14/13), tto[0]+(k[0]*5/13), tto[0]+(k[0]*7/13), xref2+(l[0]*50/11), xref2-(l[0]*50/8), xref2-(l[0]*50/6), tdo[0] - (tto[0] - tdo[0])*2.5, (9*xref2)/4]) head_y = np.array([ulo[1]+(k[1]*50/12), ulo[1]+(k[1]*60/12), ulo[1]+(k[1]*70/12), yref2+(l[1]*10), yref2+(l[1]*8), yref2+(l[1]*2), jawo[1]+(l[1]*18/4), jawo[1] - .5*l[1]]) X13, Y13, N13 = bezier_curve(head_x, head_y) # utooth_front_x = np.array([ulo[0] - 5*l[0]/6, ulo[0] - 1*l[0]/6, ulo[0] - 4*l[0]/6]) # utooth_front_y = np.array([ulo[1] + 4*l[1]/4, ulo[1] - 1*l[1]/4, ulo[1] - 3*l[1]/4]) # X14, Y14, N14 = bezier_curve(utooth_front_x, utooth_front_y) # utooth_back_x = np.array([ulo[0] - 10*l[0]/12, ulo[0] - 11*l[0]/12, ulo[0] - 7*l[0]/12, ulo[0] - 8*l[0]/12]) # utooth_back_y = np.array([ulo[1] + 4*l[1]/4, ulo[1] - 1*l[1]/4, ulo[1] + 2*l[1]/4, ulo[1] - 3*l[1]/4]) # X15, Y15, N15 = bezier_curve(utooth_back_x, utooth_back_y) xx1 = jaw[0] - .6*l[0] xx2 = jaw[0] - .4*l[0] xx3 = jaw[0] + .3*l[0] xx4 = jaw[0] + .1*l[0] xx5 = jaw[0] - 1.1*l[0] xx6 = jaw[0] - .7*l[0] xx7 = jaw[0] - .6*l[0] yy1 = jaw[1]+(l[1]*30/13) yy2 = jaw[1]+(l[1]*40/13) yy3 = jaw[1]+(l[1]*30/13) yy4 = jaw[1]-(l[1]*3/13) yy5 = jaw[1]-(l[1]*5/13) yy6 = jaw[1]+(l[1]*20/13) yy7 = jaw[1]+(l[1]*30/13) ltooth_base_x = np.array([xx1, xx2, xx3, xx4, xx5, xx6, xx7]) ltooth_base_y = np.array([yy1, yy2, yy3, yy4, yy5, yy6, yy7]) X16, Y16, N16 = bezier_curve(ltooth_base_x, ltooth_base_y) x1 = jaw[0] - l[0]*.45 x2 = jaw[0] + l[0]*.215 x3 = jaw[0] - l[0]*.215 ltooth_front_x = np.array([x1, x2, x3]) ltooth_front_y = np.array([jaw[1]+(l[1]*18/13), jaw[1]+(l[1]*28/13), jaw[1]+(l[1]*39/13)]) X17, Y17, N17 = bezier_curve(ltooth_front_x, ltooth_front_y) x1 = jaw[0] - l[0]*.45 x2 = jaw[0] - l[0]*.45 x3 = jaw[0] - l[0]*.25 x4 = jaw[0] - l[0]*.215 ltooth_back_x = np.array([x1, x2, x3, x4]) ltooth_back_y = np.array([jaw[1]+(l[1]*18/13), jaw[1]+(l[1]*33/13), jaw[1]+(l[1]*28/13), jaw[1]+(l[1]*39/13)]) X18, Y18, N18 = bezier_curve(ltooth_back_x, ltooth_back_y) line1.set_data(X1, Y1) line2.set_data(X2, Y2) line3.set_data(X3, Y3) line4.set_data(X4, Y4) line5.set_data(X5, Y5) # line6.set_data(X6, Y6) line7.set_data(X7, Y7) line8.set_data(X8, Y8) line9.set_data(X9, Y9) line10.set_data(X10, Y10) line11.set_data(X11, Y11) line12.set_data(X12, Y12) line13.set_data(X13, Y13) # line14.set_data(X14, Y14) # line15.set_data(X15, Y15) line16.set_data(X16, Y16) line17.set_data(X17, Y17) line18.set_data(X18, Y18) args.painting1 = ax.fill(X3, Y3, color = 'pink', label = 'tongue') args.painting2 = ax.fill(np.concatenate((X8, X9)), np.concatenate((Y8, Y9)), color = 'pink', label = 'tongue') args.painting3 = ax.fill(X16, Y16, 'gainsboro', zorder = 3) # args.painting4 = ax.fill(np.concatenate((X14, X15)), np.concatenate((Y14, Y15)), 'white', zorder = 4) args.painting5 = ax.fill(np.concatenate((X17, X18)), np.concatenate((Y17, Y18)), 'white', zorder = 4) args.painting6 = ax.fill(np.concatenate((X11, X13)), np.concatenate((Y11, Y13)), 'white', zorder = 4) return line1, line2, line3, line4, line5, line6, line7, line8, line9, line10, line11, line14, line15, line16, line17, line18 start = time.time() anim2 = FuncAnimation(fig, animate, frames = len(ema), interval = 10) # anim2.save('video.mp4', writer = 'ffmpeg', fps = 30) f = 'video.mp4' writervideo = FFMpegWriter(fps=30) anim2.save(f, writer=writervideo) my_bar.progress(85) text = TA.text_area("", "Merging audio and video ...") from moviepy.editor import * dur = time.time() # loading video gfg clip = VideoFileClip("video.mp4") my_bar.progress(90) # loading audio file audioclip = AudioFileClip("audio.wav") # adding audio to the video clip videoclip = clip.set_audio(audioclip) videoclip.write_videofile("output.mp4") my_bar.progress(95) video_file = open('output.mp4', 'rb') video_bytes = video_file.read() my_bar.progress(100) text = TA.text_area("", "Animation Complete!") st.video(video_bytes) gc.collect()