- リンクを取得
- ×
- メール
- 他のアプリ
StableDiffusionが世を賑わかせているので、便乗してニュースのテキストから画像を生成し、TTSの音声と併せて動画にしてみた。
まずは画像生成用のモジュールから。
!pip install accelerate diffusers transformers scipy ftfy
# make sure you're logged in with `huggingface-cli login`
from torch import autocast
from diffusers import StableDiffusionPipeline
import gc
SDpipe = StableDiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-2",
use_auth_token="enter your token"
).to("cuda")
def getImgFromPrompt(prompt,imgName):
gc.collect(generation=0)
gc.collect(generation=1)
gc.collect(generation=2)
image = SDpipe(prompt,height=512, width=512).images[0]
display(image)
image.save(imgName)
上記で以下のpromptを入れてみた。
Exclusive: JPMorgan looking to finance Italy's Serie A for up to 1 billion euros | Reuters
Sassuolo v AC Milan - Mapei Stadium - Citta del Tricolore, Reggio Emilia, Italy - May 22, 2022 AC Milan's Alessio Romagnoli lifts the trophy with teammates after winning the Serie A REUTERS/Alberto Lingria
N) has written to Italy's top soccer league to express a preliminary interest in supporting the development of Serie A's media business, three people close to the matter said.
bank rivals that of several investment funds which have approached Serie A as the league prepares to hold a tender to sell its domestic and international broadcasting licences for the seasons after 2024.
※参考日本語訳
独占。JPモルガン、イタリア・セリエAに最大10億ユーロの融資を検討|ロイター
サッスオーロ対ACミラン - マペイ・スタジアム - イタリア、レッジョ・エミリア、チッタ・デル・トリコローレ - 2022年5月22日 セリエAを制し、チームメートとトロフィーを掲げるACミランのアレッシオ・ロマニョーリ REUTERS/Alberto Lingria
イタリアサッカー界のトップリーグであるセリエAのメディア事業の発展を支援するため、ACミラン [本社:イタリア・ミュンヘン、代表取締役会長兼社長:ヴォルフガング・ニェール] が同リーグに文書を送付したと、関係者3人が明らかにした。
セリエAが2024年以降の国内・国際放送免許の売却入札を控えている中、複数の投資ファンドがセリエAに接触しているが、そのうちの1社に匹敵するものである。
これで以下の画像が出力されてきます。
これをGoogle TTSで取得した音声と静止画を合わせます。ついでにTTSのデフォルトの音声がゆっくり過ぎるので1.5倍速に変更しています。
def makeVideo(org_txt,trans_text,fname):
png_name = '/tmp/' + fname + '.png'
mp3_name = '/tmp/' + fname + '.mp3'
mp4_name = '/tmp/' + fname + '.mp4'
try:
getGtts(mp3_name,trans_text,True)
getImgFromPrompt(org_txt,png_name)
rtn = subprocess.run('ffmpeg -encoders', shell=True, stdout=PIPE, stderr=PIPE, text=True)
if ('h264_nvenc' in rtn.stdout):
enc = 'h264_nvenc'
else :
enc = 'libx264'
cmd = 'ffmpeg -y '
cmd += ' -loop 1 -i ' + png_name
cmd += ' -i ' + mp3_name + ' -filter:a "atempo=1.5" '
cmd += ' -movflags +faststart -c:a aac -profile:a aac_low -ac 2 -ar 48000 -c:v ' + enc
cmd += ' -vf yadif=0:-1:1 -profile:v high -bf 2 -g 30 -coder 1 -b:v 1M -b:a 384k -pix_fmt yuv420p -map 0:v:0 -map 1:a:0 -shortest '
cmd += mp4_name
rtn = subprocess.run(cmd, shell=True, stdout=PIPE, stderr=PIPE, text=True)
return True
except Exception as ee:
print(str(ee) + "\n")
return False
上記で作成された短い動画を一つの動画にまとめて、YouTubeへ送信。
def streamVideo(title,fname,desc):
try:
list_name = '/tmp/{}.list'.format(fname)
cmd = 'rm -f {};for f in `ls -dtr /tmp/{}*.mp4`; do echo "file \'$f\'" >> {}; done && '.format(list_name,fname,list_name)
cmd += 'ffmpeg -f concat -safe 0 -i {} -c copy /tmp/{}total.mp4 '.format(list_name,fname)
rtn = subprocess.run(cmd, shell=True, stdout=PIPE, stderr=PIPE, text=True)
rtn = subprocess.run('ffmpeg -encoders', shell=True, stdout=PIPE, stderr=PIPE, text=True)
if ('h264_nvenc' in rtn.stdout):
enc = 'h264_nvenc'
else :
enc = 'libx264'
key = getStreamKey(title,desc)
if key == None:
print( "Non Key Error!")
shutil.copyfile('/tmp/{}total.mp4'.format(fname) ,WORK_DIR + '{}total.mp4'.format(fname))
return
cmd = 'sleep 5 && ffmpeg -y -re '
cmd += ' -i /tmp/{}total.mp4 '.format(fname)
cmd += ' -codec copy '
cmd += ' -f flv rtmp://a.rtmp.youtube.com/live2/' + key
cmd += ' && sleep 10 '
rtn = subprocess.run(cmd, shell=True, stdout=PIPE, stderr=PIPE, text=True)
return True
except Exception as ee:
print( "Exception is occurred in streaming!")
print(str(ee) + "\n")
return False
これで同じ動画を配信し続けるライブストリーミングから脱却できました!
その時の動画になりますが以下をご覧ください。
https://www.youtube.com/watch?v=v-Ff-cUuets