參考:
https://zhuanlan.zhihu.com/p/69839386
https://github.com/AndersonBY/FlashText
安裝依賴可能麻煩點:
運行:
python3 FlashText1.py --text /Users/lonng/youtube_v/2a_kor1.txt --music /Users/lonng/Desktop/v+/mp3/Smile.mp3 --output /Users/lonng/Desktop/v+/vedio/2a_kor7.mp4 --width 1280 --height 720
import librosa
from moviepy.editor import *
import jieba
import click
@click.command()
@click.option('--width', prompt='Width', default=360, help='The width of video clips')
@click.option('--height', prompt='Height', default=240, help='The height of video clips')
@click.option('--text', prompt='Text file', default='text.txt', help='The source text file')
@click.option('--music', prompt='Music file', default='改革春風吹滿地.mp3', help='The music file')
@click.option('--word_split', prompt='Split words', default=False, help='Split words or not')
@click.option('--output', prompt='Output file', default='FlashText.mp4', help='The output file name')
def main(width, height, text, music, word_split, output):
with open(text, 'r', encoding='utf-8') as f:
text_str = f.read()
if word_split:
seg_list = jieba.lcut(text_str)
punct = set(''':!),.:;?]}¢'"、。〉》」』】〕〗〞︰︱︳﹐、﹒
﹔﹕﹖﹗﹚﹜﹞!),.:;?|}︴︶︸︺︼︾﹀﹂﹄﹏、~¢
々‖•·ˇˉ―--′’”([{£¥'"‵〈《「『【〔〖([{£¥〝︵︷︹︻
︽︿﹁﹃﹙﹛﹝({“‘-—_…/\\''')
word_list = list(filter(lambda x: x not in punct, seg_list))
else:
word_list = text_str.split('\n')
y, sr = librosa.load(music)
tempo, beats = librosa.beat.beat_track(y=y, sr=sr)
beat_times = list(librosa.frames_to_time(beats, sr=sr))
beat_times.append(beat_times[-1] + 1)
# print(beat_times)
clips = []
for index, beat_time in enumerate(beat_times[:-1]):
if index >= len(word_list)//2 or index >= len(beat_times)//2:
break
print(f'{index + 1}/{len(beat_times)}——{word_list[index]}')
text_clip = TextClip(
'\n'.join('%s' %id for id in word_list[index*2-2 if index!=0 else 0:index*2 if index!=0 else 2]),
fontsize=width // 8,
color='white',
size=(width, height),
method='caption',
font='msyhbd.ttc'
# font = '/System/Library/Fonts/AppleSDGothicNeo.ttc'
# font = '/System/Library/Fonts/Supplemental/AppleGothic.ttf'
)\
.set_start(beat_times[index*2-2 if index!=0 else 0])\
.set_end(beat_times[index*2-1 if index!=0 else 1])
text_clip = text_clip.set_pos('center')
clips.append(text_clip)
final_clip = CompositeVideoClip(clips)
audio_clip = AudioFileClip(music).subclip(0,int(final_clip.duration))
final_video = final_clip.set_audio(audio_clip)
final_video.write_videofile(
output,
fps=30,
codec='mpeg4',
preset='ultrafast',
audio_codec="libmp3lame",
threads=4)
if __name__ == '__main__':
main()
多字體版:
print('Importing library. Please wait.')
import librosa
from moviepy.editor import *
import jieba
import click
@click.command()
@click.option('--width', prompt='Width', default=360, help='The width of video clips')
@click.option('--height', prompt='Height', default=240, help='The height of video clips')
@click.option('--text', prompt='Text file', default='text.txt', help='The source text file')
@click.option('--music', prompt='Music file', default='改革春風吹滿地.mp3', help='The music file')
@click.option('--word_split', prompt='Split words', default=False, help='Split words or not')
@click.option('--output', prompt='Output file', default='FlashText.mp4', help='The output file name')
def main(width, height, text, music, word_split, output):
with open(text, 'r', encoding='utf-8') as f:
text_str = f.read()
if word_split:
seg_list = jieba.lcut(text_str)
punct = set(''':!),.:;?]}¢'"、。〉》」』】〕〗〞︰︱︳﹐、﹒
﹔﹕﹖﹗﹚﹜﹞!),.:;?|}︴︶︸︺︼︾﹀﹂﹄﹏、~¢
々‖•·ˇˉ―--′’”([{£¥'"‵〈《「『【〔〖([{£¥〝︵︷︹︻
︽︿﹁﹃﹙﹛﹝({“‘-—_…/\\''')
word_list = list(filter(lambda x: x not in punct, seg_list))
else:
word_list = text_str.split('\n')
y, sr = librosa.load(music)
tempo, beats = librosa.beat.beat_track(y=y, sr=sr)
beat_times = list(librosa.frames_to_time(beats, sr=sr))
beat_times.append(beat_times[-1] + 1)
# print(beat_times)
clips = []
for index, beat_time in enumerate(beat_times[:-1]):
if index >= len(word_list):
break
print(f'{index + 1}/{len(beat_times)}——{word_list[index]}')
text_clip = TextClip(
word_list[index],
fontsize=width // 8,
color='white',
size=(width, height),
method='caption',
# font='msyhbd.ttc' #中英、中日
# font = '/System/Library/Fonts/Thonburi.ttc' #越語
# font = '/Users/lonng/Desktop/v+/字體/泰語.TTF' #泰語
# font = '/Users/lonng/Desktop/v+/字體/韓國字體.ttf' #韓語
font = "/Users/lonng/Desktop/v+/字體/acherus_grotesque_-_regular.otf" #德法西意
)\
.set_start(beat_times[index*2])\
.set_end(beat_times[index*2+2])
text_clip = text_clip.set_pos('center')
clips.append(text_clip)
final_clip = CompositeVideoClip(clips)
audio_clip = AudioFileClip(music).subclip(0,int(final_clip.duration))
final_video = final_clip.set_audio(audio_clip)
final_video.write_videofile(
output,
fps=30,
codec='mpeg4',
preset='ultrafast',
audio_codec="libmp3lame",
threads=4)
if __name__ == '__main__':
main()
視頻合併代碼:
from moviepy.editor import *
v1 = VideoFileClip('/Users/lonng/Desktop/v+/片頭6.mp4')
v2 = VideoFileClip('/Users/lonng/Desktop/v+/vedio/2a_kor7.mp4')
finalclip = concatenate_videoclips([v1,v2])
finalclip.write_videofile('/Users/lonng/Desktop/v+/vedio/2a_kor1.mp4',audio_codec='aac')
視頻效果參考:https://www.youtube.com/watch?v=NjSGf2DtZb0