前段时间写了一篇《抖音自动引流脚本源码》主要通过语录系统自动生成语句或随机评论,适用于自动评论引流脚本。
今天脑洞大开,想用Python通过文字生成语音,随机获取视频或图片素材生成伪原创的短视频。
因为搬运短视频人工成本太高,我就想着能不能有自动化的方式来生成视频。
话不多说,先看看生成的视频效果
短视频:
你是我隔世的温柔,温暖我一生的眷恋
小视频:
你有信仰就年轻,岁月测试的不过是你的热忱
步骤一:
还是先通过语录系统获取文案。
msg = requests.get("https://words.lanhaiqingbao.com/api.php").text
print(msg)
步骤二:
文案获取后,就是转语音了,百度一翻后,找到一个百度语音AI工具 ,感兴趣的可以去看看,这里不多说,以下为主要代码:
if msg:
APP_ID = ''
API_KEY = ''
SECRET_KEY = ''
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
# 这里用的是百度语音识别,填入自己注册的API即可
# 参数说明https://ai.baidu.com/ai-doc/SPEECH/Gk4nlz8tc
result = client.synthesis(msg, 'zh', 1, {
'vol': 10, 'per': random.randint(3,4), 'spd':3
})
# 识别正确返回语音二进制 错误则返回dict 参照下面错误码
if not isinstance(result, dict):
with open(yuyin_path, 'wb') as f:
f.write(result)
print('处理成功')
步骤三:
生成语音后,接下来就是获取语音时长,由于之前没注意这个问题,走错了很多弯路。
以下是代码:
print('获取文案语音时长')
voice_clip = AudioFileClip(voice_path)
voice_duration = voice_clip.duration # 语音时长
步骤四:
由于文案时长有长有短的,如果短视频一个文案展示时间过长会显得单调,展示时间过短又让人感觉 看不过来,所以,下面是优化一下每个素材的展示时间,可根据需要自己调整。
# 通过语音时长设置每个素材显示多少秒
sp_time = []
if voice_duration > 20 :
minS = 3
maxS = 4.5
else:
minS = 2
maxS = 3.5
yt = voice_duration
while(yt):
if(yt<3):
sp_time.append(yt)
yt=0
break
else:
r = random.uniform(minS,maxS)
sp_time.append(r)
yt = yt - r
# 统计需要多少个素材
neep_pics = len(sp_time)
步骤五:
接下来就是获取素材了,代码如下:
# 获取背景音乐
print('随机选择一首背景音乐,并调整声音大小')
musics = [join(music_path,fn) for fn in listdir(music_path) if fn.endswith('.mp3')]
music = musics[random.randint(0,len(musics)-1)]
music_clip = AudioFileClip(music)
volumex(music_clip,0.7)
print('开始选择封面图片,获取所有美女图片,随机选择一张')
meinv_pics = [join(meinv_pic_dir,fn) for fn in listdir(meinv_pic_dir) if fn.endswith('.jpg')]
meinv_one = meinv_pics[random.randint(0,len(meinv_pics)-1)]
print('开始选择视频内容素材')
rand_sp=random.sample(range(0, 293), neep_pics)
img=Image.open(meinv_one)
try:
new_img=img.resize((720,1280),Image.BILINEAR)
new_img.save(os.path.join(meinv_pic_dir,os.path.basename(meinv_one)))
except Exception as e:
print(e)
image_clips = ImageClip(meinv_one,duration=2.5)
步骤六:
最后就是素材合并了
video_clips =[]
video_clips.append(image_clips)
sp_num = 0
for shipin in rand_sp:
sp_url = fengjing_pic_dir+'\\'+str(shipin)+'.mp4'
videos = VideoFileClip(sp_url)
videos = videos.subclip(0,sp_time[sp_num]).resize(width=720,height=1280)
video_clips.append(videos)
sp_num = sp_num + 1
result_video = concatenate_videoclips(video_clips, method='compose')
audio_clip_add = CompositeAudioClip([music_clip,voice_clip])
result_video = result_video.set_audio(audio_clip_add)
print('音乐合并完成')
print('开始导出视频...')
result_video = result_video.subclip(0,voice_duration)
result_video.write_videofile(final_video_path,fps=30,audio_codec="aac",codec="libx264")
print('视频制作成功')