import pixabay.core import glob from moviepy.editor import VideoFileClip, ImageClip, concatenate_videoclips, AudioFileClip,CompositeVideoClip, TextClip import requests import random import moviepy.editor as mp import gradio as gr import time import re import os from googletrans import Translator import ffmpeg import json import openai openai.api_key = os.environ["API_KEY"] # 首先要有apikey #openai.api_key = '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' messages = [{"role": "system", "content": "eres una mano derecha"}] def chatgpt(content, temperature=0.8): global messages print(f'ask:{content}') messages.append({"role": "user", "content": content}) time.sleep(1) try: response = openai.ChatCompletion.create( model="gpt-3.5-turbo-0301", # 或者 gpt-3.5-turbo-0301 messages=messages, temperature=temperature, max_tokens=1000, top_p=1, frequency_penalty=0, presence_penalty=0, ) except Exception as e: messages = [{"role": "system", "content": "eres una mano derecha"}] return 'Este mensaje interactivo ha alcanzado el límite superior, el token se ha borrado, vuelva a ingresar' messages.append(json.loads(str(response.choices[0].message))) print(f'answer:{response.choices[0].message.content}') resulado = response.choices[0].message.content resulado = resulado.replace('.','') return resulado pixabayapi = '' def generaraudio2(texto): nombre = s=re.sub('[^A-Za-z0-9]+', '',texto) nombre = nombre.strip() archivo = 'es_'+nombre+'.wav' print(archivo) existe = glob.glob(archivo) texto = texto.lower() texto = texto.replace('html5','hache te eme ele cinco') texto = texto.replace('html','hache te eme ele') texto = texto.replace('pdf','pe de eefe') texto = texto.replace('bit.ly','bit punto li!, eslach,') texto = texto.replace('.',',') texto = texto.replace('1','uno') texto = texto.replace('2','dos') texto = texto.replace('3','tres') texto = texto.replace('4','cuatro') texto = texto.replace('5','cinco') texto = texto.replace('6','seis') texto = texto.replace('7','siete') texto = texto.replace('8','ocho') texto = texto.replace('9','nueve') if not existe: response = requests.post("https://iricardoxd-texto-a-voz-aws.hf.space/api/predict", json={ "data": [ texto ]},headers={'Content-Type':'application/json','Authorization': 'Bearer {}'.format('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')}).json() data = response["data"] print(response['data'][0]['name']) time.sleep(5) response = requests.get("https://iricardoxd-texto-a-voz-aws.hf.space/file="+response['data'][0]['name'],headers={'Content-Type':'application/json','Authorization': 'Bearer {}'.format('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')}) if response.status_code == 200: open(archivo, 'wb').write(response.content) print('downloaded') else: print(response.status_code) return archivo import requests import shutil def buscar(palabra,category): xd = palabra.split() xdfile = '_'.join(xd) xdfile = xdfile.replace('/','').replace('"','').replace('.','').replace('!','').replace('@','').replace('\\','').replace('\n','').replace('\rn','').replace(':','').replace(',','') archivo = category+'_'+xdfile+".mp4" #existe = glob.glob(archivo) if True:#not existe: # Establece tu clave de API de Pexels PEXELS_API_KEY = '563492ad6f917000010000011b2f873942744900a033f732a56ae4b7' translator = Translator() search_term = translator.translate(palabra, dest='en').text#blob.translate(to='en') print(search_term) # Crea el URL de la API api_url = f'https://api.pexels.com/videos/search?query={search_term}&orientation=portrait&per_page=3&locale=en-US' print(api_url) # Establece los encabezados de la solicitud headers = {'Authorization': PEXELS_API_KEY} # Realiza la solicitud a la API response = requests.get(api_url, headers=headers) # Verifica si la solicitud fue exitosa if response.status_code == 200: # Obtiene los resultados de la búsqueda results = response.json()['videos'] #print(results) # Itera sobre los resultados if len(results)>0: ancho = 1 ancho = ancho - 1 numero = random.randint(0,ancho) print('el numero es ',numero) # Obtiene el URL del video for videox in results[numero]['video_files']: if videox['height']==1920: video_url = videox['link'] else: if videox['quality']=='hd': video_url = videox['link'] else: video_url = results[numero]['video_files'][0]['link'] print('el video es',video_url) # Descarga el video with requests.get(video_url, stream=True) as r: with open(archivo, 'wb') as f: shutil.copyfileobj(r.raw, f) print(f'Descargado video {numero} de {len(results)}') else: api_url2 = f'https://api.pexels.com/v1/search?query={search_term}&per_page=1&orientation=portrait&locale=en-US' print(api_url2) response2 = requests.get(api_url2, headers=headers) if response2.status_code == 200: # Obtiene los resultados de la búsqueda results2 = response2.json()['photos'] # Itera sobre los resultados if len(results2)>0: ancho = 1 ancho = ancho - 1 numero = random.randint(0,ancho) print('el numero es ',numero) # Obtiene el URL del video video_url = results2[numero]['src']['portrait'] imagen = results2[numero]['src']['original'] filex = imagen.split('/') print(' imagen es',video_url) x=len(filex)-1 archivo=filex[x] print(' imagen es x ',archivo) # Descarga el video with requests.get(video_url, stream=True) as r: with open(archivo, 'wb') as f: shutil.copyfileobj(r.raw, f) print(f'Descargado imagen {numero} de {len(results)}') else: archivo='doctor.mp4' else: print('Error al realizar la solicitud a la API') return archivo def buscarsustantivo(frase): if frase !='': prompt ='Respond only with one word of videos availables in pixels.com that best expresses the English phrase: '+frase return chatgpt(prompt) def combinar(frase, api_pixabay): global pixabayapi pixabayapi = '38938115-4ffafdfccf94d14e4d35899f5' category="travel" clips = [] palabras = frase.split(' ') palabras_frases = frase.split('.') frases = [] i = 0 linea = '' for palabra in palabras: i = i + 1 linea = linea + ' ' + palabra escena_palabras = random.randint(1, 5) if i>escena_palabras or '.' in linea or '?' in linea or '!' in linea: i=0 frases.append(linea) linea = '' if linea !='': frases.append(linea) duracionTotal = 0 for lineaf in frases: tema = buscarsustantivo(lineaf) palabras_de_tema = tema.split(' ') if len(palabras_de_tema)>1: tema = palabras_de_tema[0] #for tema in temas: if len(tema)>0: palabraclave = tema else: palabraclave = frases[0] print(palabraclave) resultado = buscar(palabraclave,category) if(resultado=='lv_0_20230901171552.mp4'): tema = buscarsustantivo(lineaf) palabras_de_tema = tema.split(' ') if len(palabras_de_tema)>1: tema = palabras_de_tema[0] #for tema in temas: if len(tema)>0: palabraclave = tema else: palabraclave = frases[0] print(palabraclave) resultado = buscar(palabraclave,category) if resultado!=None: velocidadhabla = 15#catacteres por segundos 18 teresa, 22 huggie print(len(lineaf)) duracion = len(lineaf)/velocidadhabla print(resultado) try: audiofile = generaraudio2(lineaf) clip1 = VideoFileClip(generate_subtitled_video(resultado,lineaf)) audio = AudioFileClip(audiofile) #duracion = audio.duration duracionTotal = duracionTotal + duracion subclip = clip1.subclip(0, duracion) resized_clip = subclip.resize((1080, 1920)) video = resized_clip.resize(height=1920) final_clip = video#final_clip = video.crop(x1=1166.6,y1=0,x2=2246.6,y2=1920) final_clip.audio = audio clips.append(final_clip) except Exception as e: print(f'Ocurrió un error: {e}') clip = ImageClip(resultado) # Establece la duración del clip en segundos clip = clip.set_duration(5) # Guarda el clip como un archivo de video clip.write_videofile('videoxd.mp4', fps=24) audiofile = generaraudio2(lineaf) clip1 = VideoFileClip(generate_subtitled_video('videoxd.mp4',lineaf))#generate_subtitled_video('videoxd.mp4',audiofile,lineaf)) audio = AudioFileClip(audiofile) #duracion = audio.duration duracionTotal = duracionTotal + duracion subclip = clip1.subclip(0, duracion) resized_clip = subclip.resize((1080, 1920)) video = resized_clip.resize(height=1920) final_clip = video#final_clip = video.crop(x1=1166.6,y1=0,x2=2246.6,y2=1920) #final_clip.audio = audio clips.append(final_clip) filename=palabras_frases[0]+'.mp4' if len(clips)>0: audiofilefinal = generaraudio2(frase) final_clip = concatenate_videoclips(clips) final_clip.audio = AudioFileClip(audiofilefinal) final_clip.write_videofile(filename) print('listo video') final = filename html= 'Descargar videoDescargar video' image=subir(filename,palabras_frases[0]) return (final,html,image) def generate_subtitled_video(video, transcript): input = ffmpeg.input(video) output = ffmpeg.output(input, 'srt'+video, vf="drawtext=text='"+transcript+"':fontcolor=white:fontsize=24:box=1:boxcolor=black@0.5:boxborderw=5:x=(w-text_w)/2:y=((h-text_h-line_h)/9)*10") output.run(quiet=True, overwrite_output=True) video_with_subs = 'srt'+video print(video_with_subs) return video_with_subs def subir(video,descripcion): from upload import upload_videos from auth import AuthBackend videos = [ { 'video': video, 'description': descripcion } ] auth = AuthBackend(cookies='cookies.txt') failed_videos = upload_videos(videos=videos, auth=auth) for video in failed_videos: # each input video object which failed print(f'{video["video"]} with description "{video["description"]}" failed') demo = gr.Interface(fn=combinar, inputs=["text","text"], outputs=["video","html",gr.Image(type="pil", height=360, width=540)]) demo.launch()